2013-11-20 2 views
3

Я пытаюсь использовать CAN-устройство через USB, которое поставляется с родной DLL, которую нужно обернуть классом .NET C# (исходный код, предоставленный поставщиком) который входит в свой проект. Их примеры приложений нацелены на .NET 2.0, где мое приложение предназначено для .NET 4.0. Я могу использовать код в своих типовых приложениях и отладки все просто отлично, однако, когда я пытаюсь отлаживать, я получаю BadImageFormatException:BadImageFormatException, возникающий при загрузке родной DLL в .NET 4.0

System.TypeInitializationException: The type initializer for 'TotalPhase.KomodoApi' threw an exception. ---> System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B) 

только различия между их кодом и моя, как представляется, что их код - это приложение, созданное для .NET 2.0, и (в настоящее время) мой код работает как модульный тест MSTest в .NET 4.0. Оба решения нацелены на AnyCPU. Я работаю на 64-разрядной установке Windows 7 Ultimate. Даже переход от AnyCPU к x86 не имел никакого значения. Как я могу загрузить эту родную DLL в проект AnyCPU?

+0

Вы пытались перенаправить свое приложение на .Net 4.0? Можете ли вы показать, как вы взаимодействуете с родной DLL? – vossad01

+1

Какая целевая платформа скомпилирована родной dll? x64 или x32? Вы можете использовать, чтобы узнать. Или DumpBin/Headers xxx.dll –

+0

+1 для предложения DumpBin, что помогает. Я ошибочно выбрал неправильную DLL из своего SDK. Я скопировал 64-битную DLL, когда планировал использовать 32-разрядную DLL. Эта программа должна запускаться на 32-битных клиентах. –

ответ

8

Если вы используете BadImageFormatException при взаимодействии с родной DLL, это почти всегда означает, что вы пытаетесь взаимодействовать с 32-разрядной DLL во время работы в 64-разрядной среде CLR или наоборот.

Когда вы запускаете примеры приложений, выполняете ли процессы *32 в столбце «Название изображения» вкладки «Процессы» диспетчера задач? Это означает, что приложения работают в 32-разрядной среде CLR. Проверьте свое приложение. Возможно, что на компьютере, на котором вы тестируете, есть только 32-разрядная среда выполнения .NET 2.0, но как 32-разрядная, так и 64-разрядная версии .NET 4.0 или наоборот.

Если вы распространяете родную DLL с вашим .NET-приложением, вы должны настроить для своего проекта запуска целевой x86 или x64 (в отличие от AnyCPU), в зависимости от того, являются ли собственные библиотеки 32-разрядными или 64-разрядными , Вы всегда можете отправлять как 32-битную, так и 64-битную версии, и пусть установщик выбирает, какие двоичные файлы должны быть установлены на основе архитектуры клиента.

В качестве альтернативы вы можете отправлять как 32-разрядные, так и 64-разрядные библиотеки с разными именами файлов, определять отдельные P/Invoke-заглушки для каждой версии и решать, какой из них вызывать во время выполнения. Самый простой способ сделать это, вероятно, состоял бы в том, чтобы обернуть ваши собственные вызовы в интерфейсе (например, INativeMethods) и выбрать, какую реализацию нужно создать во время выполнения на основе IntPtr.Size. С помощью этого метода вы все равно можете нацелить AnyCPU.

Смежные вопросы