【问题标题】:p/invoke a 32-bit dll from a C# program running on an x64 machinep/从 x64 机器上运行的 C# 程序调用 32 位 dll
【发布时间】:2010-06-24 01:37:28
【问题描述】:

我有一个 C# 程序,我在 x64 计算机上使用所有默认设置编译它。

我想 p/调用一个我知道是 32 位(非托管)C++ DLL 的 DLL。

当我的 C# 程序在 32 位机器上运行时,我可以让它工作,而不是在 64 位机器上运行。

如何在 DllImport 调用中指定要调用到 32 位 dll 中的内容?

我现在拥有的示例:

[DllImport("test32bitdll.dll", SetLastError=true)]
public static extern void MyFunc();

我没有test32bitdll.dll文件的源代码。

【问题讨论】:

标签: c# c++ pinvoke


【解决方案1】:

无法在 64 位进程中运行 32 位非托管代码。或者反过来。您可用的选项:

  • 使用“构建”选项卡中的“目标平台”设置强制 EXE 在 x86 模式下运行
  • 在 x64 模式下重新编译 C++ DLL。如果您拥有源代码而不是依赖于某些仅在 32 位中可用的第 3 方代码,这通常无需太多麻烦就可以实现
  • 在强制以 32 位模式运行的代理进程中运行 C++ DLL。您需要使用进程间通信机制来让您的 64 位进程与 32 位代理对话。命名管道、套接字、.NET Remoting、WCF 是 .NET 中的典型选择。

第 3 个选项可以为您带来最大的收益,但如果要交换大量数据并且往往很脆弱,则它可能会很慢。处理代理过程的失败可能很困难。

【讨论】:

    【解决方案2】:

    让这个工作最简单的方法是将你的 exe 更改为“仅适用于 x86”。

    【讨论】:

    • 昨晚遇到了同样的问题——正是我所做的。
    猜你喜欢
    • 2012-11-07
    • 2010-10-01
    • 2012-07-05
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多