如何在64位项目中引用32位DLL?

16

我有一个C# 2.0项目,目标为“任何CPU”,但它引用了一个构建32位DLL的C++项目。

当我尝试在64位机器上运行程序时,出现以下错误:

System.BadImageFormatException未处理的消息:无法加载文件或程序集 TreeTMHook, Version=1.0.2889.19619, Culture=neutral, PublicKeyToken=null 或其某个依赖项。尝试加载格式不正确的程序。

如何解决这个问题?

更新

我希望能将主项目保持为任何CPU。

谢谢。


1
请记住“任何 CPU”的含义。您声称主项目可以在任何地方运行,这意味着您需要负责消除所有架构依赖关系。 - MSalters
5个回答

15

如果你想在64位的计算机上正确加载32位DLL文件,你需要将你的.NET项目构建为32位(x86目标)。

关于更新:

如果你想保持项目为“任何CPU”,你需要有32位和64位版本的DLL文件,并确保适当的版本随你的应用程序分发。如果无法将另一个项目构建为64位,则必须仅将你的.NET项目构建为32位。


4

您需要强制将EXE项目运行在32位模式下,以便它可以使用该C++ DLL。项目+属性,生成选项卡,平台目标=x86。


1

你可能想要看一下文章, 它解释了为什么这是不可能的,简单来说,因为在访问非托管代码时涉及到指针。


1
为了保持您的主项目作为“Any CPU”,您需要提供32位和64位版本的.dll文件 - 这应该是可能的,因为您正在从源代码构建它。
然后,您需要提供一个指向正确dll版本的清单,以便根据平台指向可执行文件。

-2
请使用 .net 反射来调用对象及其方法,而不是直接引用 32 位 dll。

2
我认为反射在这里无济于事,因为您无法加载非托管的 DLL! - LionAM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接