有没有办法从托管的64位代码加载32位DLL而不将托管代码降级为32位?

时间:2011-03-31 17:37:41

标签: c# .net 32bit-64bit dllimport loadlibrary

我有一个程序集,Utils设置为“Any CPU”,我有一个托管EXE,它也被设置为“Any CPU”。 exe使用我的Utils程序集。

My Utils程序集必须加载一个非托管的非com 32位DLL并调用一些函数。

我每次都会收到“尝试加载格式不正确的程序”的异常。

有没有办法让我的EXE和程序集在64位模式下运行,但仍然加载32位DLL来进行一些简单的函数调用?

我知道如果我在32位模式下构建我的EXE然后它会工作,但是我的Utils程序集将被WCF Web服务和其他可能以64位模式运行的程序使用,它仍然需要调用32位DLL。

有什么办法吗?我尝试使用LoadLibrary,它从64位代码调用时返回0指针,而DllImport则给出异常。

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

不,这是不可能的。如果您无法将DLL升级到64位,那么您将不得不做一些绝望的事情,比如在32位进程中托管它并使用.NET进程间通信机制之一来使用它。像WCF一样。

答案 1 :(得分:2)

如果你不能或不会改变过程或装配以匹配另一个,那么不,没有简单的方法可以做你想做的事。

从64位进程与32位程序集进行交互的唯一方法(反之亦然)是将程序集加载到单独的进程中,并使用进程间调用与之通信。

这两种情况之间的代码根本不兼容,所以实在没办法。

或者:

  1. 将您的程序以及需要与该程序集交互的所有其他进程更改为32位
  2. 将您的程序集更改为任何CPU
  3. 使用填充程序和IRPC,如WCF或类似的

答案 2 :(得分:0)

没有。一切都必须一样。