Как потребовать x86 для цепочки зависимостей .NET при сборке
Вопрос
У нас есть несколько проектов, которые используют p4.net, управляемая DLL, которая, в свою очередь, зависит от p4dn.dll, 32-разрядной неуправляемой DLL.Это вызывает проблемы в системах x64, поэтому мне приходилось заходить в каждый проект, использующий p4.net, и устанавливать тип процессора x86.
Если я правильно понимаю проблему, то когда .NET загружает exe-файл, он проверяет наличие манифеста, а если его нет, то делает то, что лучше всего подходит для типа процессора.Затем, когда он сталкивается с 32-битной dll, его рвет.
Я могу перейти к каждому проекту, использующему p4.net, и пометить его как 32-битный.Но у нас их довольно много.Кроме того, люди будут продолжать создавать новые и забудут установить 32-битную версию, а затем в будущем у нас снова возникнет эта проблема, когда кто-то еще попытается использовать ее на x64.
Мой вопрос таков:Есть ли способ заставить .NET автоматически загружать любое приложение, использующее p4dn.dll как 32-битное?В противном случае есть ли способ, чтобы IDE обнаружила это и не смогла выполнить сборку?
Или можно ли создать файл .manifest, который я могу поместить рядом с p4api или p4dn.dll, чтобы любые приложения, использующие их, автоматически запускались в 32-битной версии?
Решение
Если у вас нет другого выбора, вы можете использовать корфлаги как часть сценария автоматической сборки, чтобы пометить все библиотеки DLL .NET как x86 – corflags /32bit+ file.dll
.Хотя я считаю, что правильное образование разработчиков — более адекватное решение.
Другие советы
CLR проверяет тип платформы, только если загружает сборку из GAC.Я предполагаю, что p4dn.dll находится в корневой папке приложения, поэтому я думаю, что вы ошибаетесь в своей логике.
Похоже, что p4dn.dll нельзя использовать, если он работает в режиме WoW64, а ваше приложение изначально работает в режиме x64.Я думаю, что лучший способ — скомпилировать весь ваш проект, ориентированный на платформу x86 (32).Или разбить его на части, чтобы вызывающая программа p4dn.dll всегда работала в режиме WoW64.
Кроме того, вам следует связаться с разработчиками p4net, чтобы добавить полную поддержку платформы x64.
Я не знаю способа сделать это автоматически.Я бы рекомендовал вам сделать следующее:
- Обучайте своих разработчиков,
- Добавьте эту тему в свою внутреннюю базу знаний и
- Добавьте платформы x64 в свои тестовые среды.
Кроме того, вы можете подумать о написании надстройки VS, которая проверяет правильную целевую платформу.Но тогда может быть и динамическое создание COM-компонентов...