FAQ TBarCode .NET
Исключение Bad Image Format после развёртывания настольного приложения
Исключение Bad Image Format после развёртывания настольного приложения
Следующее относится к версиям TBarCode .NET до 11.15.
Вы получаете следующее исключение после развёртывания вашего настольного приложения Windows.
System.BadImageFormatException: Could not load file or assembly 'TECIT.TBarCode, Version=11.10.0.0, Culture=neutral, PublicKeyToken=1b5f4306b234b83d' or one of its dependencies. An attempt was made to load a program with an incorrect format.
Причина проблемы: во время разработки вы ссылались на 32-битную версию DLL. Теперь при развёртывании EXE выполняется как 64-битный процесс и не может загрузить TECIT.TBarCode.dll (которая 32-битная).
Справочная информация:
Из-за загрузки нативных библиотек TECIT.TBarCode.dll зависит от платформы и не помечена как CPU=Any. На компьютере для разработки вы обычно запускаете программу как 32-битный процесс, потому что Visual Studio — 32-битное приложение. Но даже если процесс работает как 64-битный (либо с CPU=Any, либо с CPU=x64), он всё равно может загрузить требуемые DLL из GAC и из папки program files/common files. Наш инсталлятор устанавливает обе версии (32 и 64 бит) и также расширяет путь поиска. Поэтому DLL всегда будут найдены.
Затем при переносе на целевую систему, из-за управляемого кода, исполняемый файл может работать как в 32-, так и в 64-битном режиме. В некоторых случаях процесс не может найти корректные DLL, потому что он автоматически переключается с 32 на 64 бита, либо DLL нет в пути поиска или GAC, либо они просто не установлены.
Действуйте следующим образом — выберите один из вариантов ниже:
Соберите ваш EXE с целевым CPU x86
Сошлитесь на TECIT.TBarcode.dll в папке «C:\Program Files (x86)\Common Files\TEC-IT\TBarCode\11*» и скопируйте TECIT.TBarcode.dll + TBarCode11.dll + zlib1.dll в папку развёртывания. zlib1.dll нужна только при использовании gzip-сжатия с 2D-кодами. Установите x86 VCRedist от Microsoft (2015 U3 RC или более новое издание 2015-2019).
Соберите ваш EXE с целевым CPU x64 (64 бита)
Сошлитесь на TECIT.TBarcode.dll в папке «C:\Program Files\Common Files\TEC-IT\TBarCode\11*» и скопируйте TECIT.TBarcode.dll + TBarCode11_x64.dll + zlib1.dll в папку развёртывания. zlib1.dll нужна только при использовании gzip-сжатия с 2D-кодами. Установите x64 VCRedist от Microsoft (2015 U3 RC или более новое издание 2017–2026).
Соберите ваш EXE с целевым CPU Any
Для программирования сошлитесь на TECIT.TBarcode.dll в папке «C:\Program Files (x86)\Common Files\TEC-IT\TBarCode\11*». Для развёртывания не копируйте никакие DLL TEC-IT вместе с вашим EXE. Удалите TECIT.TBarCode.dll из папки развёртывания. Вместо этого установите инсталлятор TBarCode SDK Setup и выберите в списке возможностей только компонент TBarCode .NET — это установит версии x86 и x64 параллельно в GAC и расширит переменную PATH путём к DLL. Сборка TBarCode будет загружена автоматически в правильной версии, потому что она находится в GAC для 32 и 64 бит. Если вы не хотите запускать установку TBarCode вручную, это также можно автоматизировать с помощью параметров командной строки (тихая установка). Установите как x86, так и x64 VCRedist от Microsoft (издание 2017–2026).