Приложение .NET загружает смешанную DLL, используя любой процессор

Я новичок в создании приложений .NET, особенно смешанных приложений.

Недавно я создал набор (статических) библиотек для клиента на (неуправляемом) C++ (под MS Visual Studio 2010), поддерживающих как 32-битные, так и 64-битные компиляции, которые загружались некоторыми приложениями, и которые в целом были в порядке . (Внутри эта функциональность использует различные сторонние библиотеки, такие как OpenGL, boost, glm и т. д.)

Теперь он хотел бы также иметь возможность использовать некоторые функции, которые я предоставил в качестве пользовательского элемента управления в своем приложении C#.

Итак, я создал dll с поддержкой CLR, используя C++/CLI для создания классов-оболочек для моей функциональности, затем перешел к созданию пользовательского элемента управления WPF, который является общедоступным (и, следовательно, к нему можно получить доступ извне). 32 и 64 бит.

Затем для тестирования я создал простое приложение на C# (и оно действительно довольно простое, так как я новичок в C#, мой опыт — C/C++), которое может быть построено на 32 или 64 битах и ​​может успешно загружать элемент управления из моей DLL. и делать то, что от него ожидается.

Проблема, с которой я теперь столкнулся, заключается в том, что он сказал, что хочет иметь возможность распространять только один исполняемый файл как «любой процессор», который затем должен загружать соответствующий код (т.е. 32- или 64-битный) в зависимости от того, где он запущен.

Итак, что я сделал, так это добавил конфигурацию «Любой ЦП» в тестовый проект С# и установил «целевую платформу» на вкладке «Сборка» на «Любой ЦП». Но теперь я не уверен в диспетчере конфигураций, какую платформу установить для других проектов (например, статические библиотеки C++, используемые dll смешанного режима C++/CLI). Поэтому для тестирования я оставил его на x64, но когда я его соберу, я получаю предупреждение:

Warning MSB3270: There was a mismatch between the processor architecture of the project being built "MSIL" and the processor architecture of the reference "(name of my 64 bit dll)", "AMD64".  <br /> 
This mismatch may cause runtime failures. Please consider changing the targeted processor architecture of your project through the Configuration Manager so as to align the processor architectures between your project and references, or take a dependency on references with a processor architecture that matches the targeted processor architecture of your project.

Однако он работает нормально, хотя и выдает мне это предупреждение. Я получаю такое же предупреждение, когда устанавливаю для других своих проектов значение «Win32», просто упоминая вместо этого «x86», но в этом случае при запуске возникает исключение, говорящее: «В PresentationCore.dll произошло необработанное исключение типа« System.BadImageFormatException ». "

Так что мне нужно изменить его на? Как я могу заставить его загрузить исполняемый файл, а затем решить, какую DLL загрузить? Я действительно не уверен, как действовать и заставить его работать так, как меня просили.


person Bjoern    schedule 03.03.2014    source источник
comment
youtube.com/watch?v=7qnd-hdmgfk   -  person Hans Passant    schedule 03.03.2014


Ответы (1)


Решение проблемы я нашел в статье про использование библиотек Perforce:

http://scottbilas.com/blog/automatically-choose-32-or-64-bit-mixed-mode-dlls/

По сути, вам нужно создать прокси-dll, который является вашей целью вывода и используется в качестве ссылки для хостинга приложения C # (WPF в моем случае).

Затем вы создаете версии dll для x64 и x86, которые предоставляете вместе с исполняемым файлом. Вы должны убедиться, что прокси-dll НЕ существует вместе с исполняемым файлом.

При запуске вы создаете обработчик событий для AppDomain.CurrentDomain.AssemblyResolve, который будет запущен, если не сможет найти прокси-dll.

Затем, в зависимости от того, находитесь ли вы в 32- или 64-разрядной среде, он может выбрать правильную DLL и загрузить ее.

person Bjoern    schedule 07.03.2014
comment
Спасибо, что задокументировали свои выводы. Однако это слишком расплывчато. Было бы полезно подробное пошаговое объяснение того, что вы на самом деле сделали, с реальными (или близкими к реальным) примерами. - person Mike Nakis; 13.02.2020