Как требовать x86 вверх по цепочке зависимостей.NET при сборке

У нас есть несколько проектов, в которых используется p4.net, управляемая DLL, которая, в свою очередь, зависит от p4dn.dll, 32-разрядной неуправляемой DLL. Это имеет проблемы в системах x64, поэтому я должен был перейти к каждому проекту, использующему p4.net, и установить его тип процессора x86.

Если я правильно понимаю проблему, это то, что когда.NET загружает исполняемый файл, он проверяет манифест, а если нет, то делает то, что лучше для процессора. Затем, когда он сталкивается с 32-битной DLL, это barfs.

Я могу перейти к каждому проекту, использующему p4.net, и отметить его как 32-битный. Но у нас их немало. Кроме того, люди собираются продолжать создавать новые и забыть установить 32-битные, и тогда в будущем у нас снова возникнет эта проблема, когда кто-то еще попытается использовать ее на x64.

Мой вопрос заключается в следующем: есть ли способ, чтобы.NET автоматически загружал любое приложение, которое использует p4dn.dll как 32-битный? В противном случае, есть ли способ для IDE обнаружить это и не построить?

Или можно создать файл.manifest, который я могу поместить рядом с p4api или p4dn.dll, чтобы любые приложения, использующие их, автоматически запускались в 32-разрядной версии?

3 ответа

Решение

Если у вас нет другого выбора, вы можете использовать corflags как часть сценария автоматической сборки, чтобы пометить все библиотеки.NET как x86 - corflags /32bit+ file.dll, Хотя я считаю, что правильное обучение разработчиков является более адекватным решением.

CLR проверяет тип платформы только в том случае, если загружает сборку из GAC. Я думаю, что p4dn.dll содержится в корневой папке приложения, поэтому я думаю, что вы ошибаетесь в своей логике.

Кажется, что p4dn.dll нельзя использовать, когда он работает в режиме WoW64, а ваше приложение работает в режиме x64. Я думаю, что лучший способ - это скомпилировать весь ваш проект на платформе x86 (32). Или разбейте его на части, чтобы вызывающий p4dn.dll всегда работал в режиме WoW64.

Кроме того, вы должны связаться с разработчиками p4net, чтобы добавить полную поддержку платформы x64.

Я не знаю ни одного способа сделать это автоматически. Я бы порекомендовал вам сделать следующее:

  • Обучите своих разработчиков,
  • Добавьте эту тему в свою внутреннюю базу знаний и
  • Добавьте платформы x64 в свои тестовые среды

Кроме того, вы можете написать надстройку VS, которая проверяет правильность целевой платформы. Но тогда может быть динамическое создание компонентов COM, тоже...

Другие вопросы по тегам