我们有几个项目使用 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 位中自动运行?

有帮助吗?

解决方案

如果你绝对没有其他的选择,你可以使用的 corflags 的作为自动构建脚本的一部分,以纪念所有的.NET的DLL为86的 - corflags /32bit+ file.dll。 虽然我认为,开发商适当的教育是比较适当的解决办法。

其他提示

CLR仅检查是否能将其装入从GAC组装平台类型。我猜p4dn.dll是应用程序根目录下包含的,所以我想你错到你的逻辑。

看来,当它在了WoW64模式的运行,你的应用程序在64位模式下本地运行p4dn.dll不能使用。我认为最好的方式是编译所有项目针对86(32)平台。或分解成各部分,所以p4dn.dll呼叫者将总是在了WoW64模式下运行。

此外,你应该联系p4net开发者加入全x64平台的支持。

我不知道有什么方法可以自动执行此操作。我建议您执行以下操作:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top