Ссылки на управляемый код между любым процессором и x64 - PullRequest
5 голосов
/ 04 марта 2011

У меня есть проект C ++ / CLI в смешанном режиме, который скомпилирован как замороженные библиотеки x86 и x64.

У меня есть приложение на C #, которому нужно использовать этот проект, который скомпилирован как «Любой процессор».Как я могу правильно ссылаться на правильную DLL из приложения C #?Если щелкнуть правой кнопкой мыши ссылку «Добавить ссылку», я должен выбрать только 1 из 2 dll.
Мое приложение «ЛЮБОЙ ЦП» на C # иногда запускается как x64, а иногда как процесс x86.

Я слышал, что вы можете, возможно,сделать это через смарт-файл конфигурации.

Ответы [ 2 ]

5 голосов
/ 04 марта 2011

Есть несколько способов справиться с этим. Первый - самый простой, признайте тот факт, что ваше приложение действительно зависит от целевой архитектуры. И что AnyCPU не правильная настройка. очень редко требуется огромное пространство виртуальной адресной памяти, которое вы получаете от x64, тем более что вы также хотите и должны заставить его работать на x86. Так что установите целевой объект платформы EXE на x86, и все готово.

Во-вторых, делается вывод, что это просто проблема развертывания. Все, что вам нужно сделать, это скопировать сборку x64 сборки смешанного режима, когда ваше приложение установлено в 64-разрядной операционной системе, а сборка x86 - в 32-разрядной операционной системе. Вам нужно будет создать проект установки, который позаботится об этом. Самый простой способ - создать два из них. Также единственный способ afaik.

Третий - тот, с колокольчиками на котором он работает в любом случае, тот, о котором вы, несомненно, спрашиваете. Это требует изменений в коде, проекте и установщике. Что вам нужно сделать, это написать событие после сборки, которое создаст две подкаталоги с именами, такими как «x86» и «x64». И скопируйте в них соответствующую версию DLL. Это гарантирует, что CLR не сможет найти эти сборки.

В вашем коде вы должны написать обработчик события для события AppDomain.CurrentDomain.AssemblyResolve. Подпишите его в методе Main () задолго до того, как вы попытаетесь использовать какие-либо типы из сборки. Обработчик событий должен использовать Assembly.LoadFrom () для загрузки правильной сборки из подкаталога на основе значения IntPtr.Size. Это 8, когда вы работаете в 64-битном режиме.

Я должен упомянуть еще один подход, но он, как правило, осуждается в SO. Установите обе сборки в GAC. Все автоматически.

2 голосов
/ 04 марта 2011

Даже если ваш проект C ++ компилируется дважды, он должен иметь одинаковый управляемый интерфейс для библиотек DLL как x86, так и x64.Следовательно, до тех пор, пока вы не используете строгую подпись, не должно иметь значения, на какую версию DLL вы ссылаетесь.Важно то, что на целевой машине развернута правильная версия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...