【问题标题】:AnyCPU C# DLL in 64bit process loads 32bit DLL64位进程中的AnyCPU C# DLL加载32位DLL
【发布时间】: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


    【解决方案1】:

    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函数。

    【讨论】:

      【解决方案2】:

      您只能加载与进程具有相同位数的 dll。 Any CPU dll 本身可以在 64 位和 32 位进程中加载​​,但这并不意味着可以将本机 32 位 dll 加载到 64 位进程中。

      我知道的唯一解决方法是拥有一个 32 位辅助进程来加载您的 32 位 dll,然后与该进程通信。

      【讨论】:

      • 其他解决方法是让 AnyCPU 程序集加载与架构对应的 C++ DLL
      • 如果您有 64 位版本的 dll,这显然是最好的解决方案。
      【解决方案3】:

      不,您不能将 32 位 DLL 加载到 64 位进程中。

      AnyCPU 表示 C# DLL 可以加载到 32 位或 64 位进程中,而不是它可以加载任一位的 DLL。

      【讨论】:

        【解决方案4】:

        32 位 DLL 不能在 64 位进程中加载​​。

        我在您的问题中发现了一个问题:您的 AnyCPU 程序集不可能加载 32 位 C++ dll,因为它使程序集特定于该架构。

        设置为AnyCPU 意味着它将动态加载特定于其运行的体系结构的DLL。这样它就可以在任何 CPU 上运行。

        简而言之,程序集被错误地标记为 AnyCPU。

        【讨论】:

        • 32 位程序集也可以在任何 CPU 上运行。
        猜你喜欢
        • 2018-05-29
        • 2014-08-10
        • 1970-01-01
        • 2013-06-08
        • 1970-01-01
        • 2012-08-06
        • 1970-01-01
        • 2012-02-05
        • 2015-01-07
        相关资源
        最近更新 更多