【发布时间】:2011-08-12 21:52:42
【问题描述】:
我有一个加载 AnyCPU C# DLL 的 64 位 C++ 进程。 这个 AnyCPU C# DLL 可以加载 32 位 C++ DLL,还是只能加载 64 位 DLL?
谢谢! :-)
【问题讨论】:
标签: c# c++ 64-bit 32bit-64bit
我有一个加载 AnyCPU C# DLL 的 64 位 C++ 进程。 这个 AnyCPU C# DLL 可以加载 32 位 C++ DLL,还是只能加载 64 位 DLL?
谢谢! :-)
【问题讨论】:
标签: c# c++ 64-bit 32bit-64bit
AnyCPU DLL 在调用进程的上下文中运行,根据您的问题,它是 x64。如果此 AnyCPU DLL 加载另一个 DLL,它也会在加载 AnyCPU DLL 的 x64 调用进程的上下文中运行。这是跨不同平台运行代码的问题。如果您想通过调用 AnyCPU DLL 的 x64 进程运行 32 位 DLL,那么您需要创建称为 SURROGATE 进程的东西 - 这基本上是一个可以运行和加载 32 位 DLL 的 x86(32 位)进程您想从调用 x64 进程访问。一旦你运行了这个x86进程,这个x64进程就可以通过进程间通信与x86进程(已经加载了x86 DLL)进行通信,并且可以实现从x64进程间接调用x86 DLL函数。
【讨论】:
您只能加载与进程具有相同位数的 dll。 Any CPU dll 本身可以在 64 位和 32 位进程中加载,但这并不意味着可以将本机 32 位 dll 加载到 64 位进程中。
我知道的唯一解决方法是拥有一个 32 位辅助进程来加载您的 32 位 dll,然后与该进程通信。
【讨论】:
不,您不能将 32 位 DLL 加载到 64 位进程中。
AnyCPU 表示 C# DLL 可以加载到 32 位或 64 位进程中,而不是它可以加载任一位的 DLL。
【讨论】:
32 位 DLL 不能在 64 位进程中加载。
我在您的问题中发现了一个问题:您的 AnyCPU 程序集不可能加载 32 位 C++ dll,因为它使程序集特定于该架构。
设置为AnyCPU 意味着它将动态加载特定于其运行的体系结构的DLL。这样它就可以在任何 CPU 上运行。
简而言之,程序集被错误地标记为 AnyCPU。
【讨论】: