Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法从托管64位代码加载32位DLL,而不将托管代码降级为32位?_C#_.net_32bit 64bit_Dllimport_Loadlibrary - Fatal编程技术网

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

C# 有没有办法从托管64位代码加载32位DLL,而不将托管代码降级为32位?,c#,.net,32bit-64bit,dllimport,loadlibrary,C#,.net,32bit 64bit,Dllimport,Loadlibrary,我有一个程序集Utils,它被设置为“任意CPU”,我有一个托管EXE,它也被设置为“任意CPU”。exe使用我的Utils程序集 我的Utils程序集必须加载非托管、非com 32位DLL并调用某些函数 我每次都收到一个异常“试图加载一个格式不正确的程序” 有没有办法让我的EXE和程序集仍在64位模式下运行,但仍然加载32位DLL以进行一些简单的函数调用 我知道,如果我在32位模式下构建EXE,那么它就会工作,但我的Utils程序集将被WCF web服务和其他可能在64位模式下运行的程序使用,

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

我的Utils程序集必须加载非托管、非com 32位DLL并调用某些函数

我每次都收到一个异常“试图加载一个格式不正确的程序”

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

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

有办法吗?我尝试过使用LoadLibrary,它在从64位代码调用时只返回一个0指针,以及DllImport,它给了我一个异常


谢谢你的帮助。

不。一切都必须一样。

不,这是不可能的。如果无法将DLL升级到64位,则必须执行某些操作,例如将其托管在32位进程中,并使用一种.NET进程间通信机制来使用它。像WCF一样。

如果您不能或不愿意更改流程或程序集以匹配其他流程或程序集,那么不,没有简单的方法来完成您想要做的事情

从64位进程与32位程序集交互的唯一方法,或者从64位进程与32位程序集交互的唯一方法,是将该程序集加载到单独的进程中,并使用进程间调用与之对话

这两种情况下的代码基本上是不兼容的,所以真的没有办法

要么:

  • 将您的程序以及需要与该程序集交互的所有其他进程也更改为32位
  • 将程序集也更改为任何CPU
  • 使用垫片过程和IRPC,如WCF或类似工具

  • 将32位代码作为COM对象公开,并在进程外访问它。这是您唯一的选择。如果您使用IIS托管WCF,您应该尝试以下答案: