我们有几个项目使用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位运行?
答案 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)
我不知道有任何办法自动执行此操作。我建议你做以下事情:
此外,您可能会考虑编写一个VS加载项来检查正确的目标平台。但是,也可能会动态创建COM组件......