Неверный формат изображения при запуске управляемой сборки C++ / CLI в .NET Core 3.1
Я был очень взволнован, увидев, что в последних предварительных версиях.NET Core 3.1 и Visual Studio 2019 добавлена поддержка управляемых проектов C++/CLI, поскольку такой проект - единственное, что нужно сохранить в рамках конкретного проекта на.NET Framework.
Итак, я установил Visual Studio Preview 16.4.0 Preview 4 вместе с опциями "Поддержка C++/CLI для v142...", и, как и ожидалось, я вижу новые шаблоны C++ CLR и установил.NET Core 3.1 preview 2.
Я создал новый проект, используя шаблон "Библиотека классов CLR (.NET Core)", скопировал файлы старого управляемого проекта C++/CLI, немного подправил, и сборка построена - отлично!
Однако, когда я пытаюсь использовать сборку в.NET Core 3.1, я получаю фатальное исключение:
Unhandled exception. System.BadImageFormatException: Could not load file or assembly 'MyAssembly, Version=2019.0.1.0, Culture=neutral, PublicKeyToken=null'. An attempt was made to load a program with an incorrect format.
File name: 'MyAssembly, Version=2019.0.1.0, Culture=neutral, PublicKeyToken=null'
at TestApp.Program.Main(String[] args)
И управляемая сборка, и тестовое приложение нацелены на X64. Есть идеи, в чем может быть проблема?
3 ответа
Кто-то из Microsoft предоставил решение в репозитории Github.
Когда создается управляемый проект C++/CLI, файл ijwhost.dll
помещается в выходную папку рядом со сборкой - этот файл необходимо развернуть с приложением, которое использует сборку.
После помещения ijwhost.dll
в той же папке, что и приложение, он работал, как ожидалось.
Кстати, старый проект C++/CLI, который я создал для предварительной версии.NET Core 3.1, на самом деле довольно сложен - я очень приятно удивлен, что он в основном "просто работал"!
Надеюсь, в будущем будет использоваться более качественное сообщение об ошибке!
Я использую .net 5.0 в качестве среды выполнения CLI. В конце концов я обнаружил, что проблема заключается в отсутствии собственных зависимостей DLL.
Для собственных приложений появится сообщение об ошибке, сообщающее, какая DLL отсутствует. Находясь в ядре .NET C++/CLI, они выдают только исключение BadImageFormatException.
Мое решение - создать проект чистой собственной консоли, вставить код, который вызовет исключение BadImageFormatException, запустить его и посмотреть, какая библиотека DLL отсутствует, а затем добавить ее обратно в список файлов проекта C++/CLI.
Я только что обнаружил неожиданные зависимости.
В моем случае приложение C # Net 5.0 загружает управляемую dll C++, которая обертывает неуправляемую dll C++. Я получаю эту ошибку каждый раз, когда пытаюсь запустить на компьютере без установленной Visual Studio. Я отладил его с помощью ProcessMonitor и выяснил, что он не может найти VCRUNTIME140D.dll. Нашел эти dll на моем компьютере разработчика, скопировал их (как 32-, так и 64-разрядные версии) с моей машины разработчика на компьютер клиента в соответствующие папки, и это помогло. Надеюсь кому-нибудь поможет. Ваше здоровье.