如何在构建时要求x86在.NET依赖关系链中

时间:2009-02-18 20:44:58

标签: .net x86 64-bit manifest sxs

我们有几个项目使用p4.net,一个托管DLL,而后者依赖于p4dn.dll,一个32位非托管DLL。这在x64系统上有问题,所以我不得不去每个使用p4.net的项目并将其处理器类型设置为x86。

如果我理解正确的问题,那就是当.NET加载一个exe时,它会检查一个清单,如果没有,它会对处理器类型做最好的事情。然后,当它进入32位dll时,它会barfs。

我可以访问使用p4.net的每个项目并将其标记为32位。但是我们有很多这样的。此外,人们将继续创建新的并且忘记设置32位,然后在将来我们将再次遇到此问题,当其他人试图在x64上使用它时。

我的问题是:有没有办法让.NET自动加载任何使用p4dn.dll作为32位的应用程序?如果失败了,IDE是否有办法检测到这种情况并且无法构建?

或者是否可以创建一个.manifest文件,我可以放在p4api或p4dn.dll旁边,这样任何使用它们的应用程序都会自动以32位运行?

3 个答案:

答案 0 :(得分:2)

如果您完全没有其他选择,可以使用 corflags 作为自动构建脚本的一部分,将所有.NET dll标记为x86 - corflags /32bit+ file.dll。 虽然我认为开发人员的适当教育是更充分的解决方案。

答案 1 :(得分:1)

CLR仅在从GAC加载程序集时才检查平台类型。我猜p4dn.dll包含在应用程序根文件夹下,所以我认为你的逻辑错了。

当它在WoW64模式下运行并且您的应用程序本身在x64模式下运行时,似乎无法使用p4dn.dll。我认为最好的方法是编译所有针对x86(32)平台的项目。或者将其分解为部分,因此p4dn.dll调用者将始终以WoW64模式运行。

此外,您应该联系p4net开发人员以添加完整的x64平台支持。

答案 2 :(得分:0)

我不知道有任何办法自动执行此操作。我建议你做以下事情:

  • 培训您的开发人员,
  • 将此主题添加到您的内部知识库和
  • 将x64平台添加到测试环境

此外,您可能会考虑编写一个VS加载项来检查正确的目标平台。但是,也可能会动态创建COM组件......