【问题标题】:Calling Unmanaged C++ from C#从 C# 调用非托管 C++
【发布时间】:2013-09-30 14:48:55
【问题描述】:

我正在使用 .NET 4.0 在 Win7 上运行 VS2012。 我尝试了以下方法:

  • 创建 C++ DLL 项目
  • 选中\取消选中导出符号框
  • 我已确保我的平台目标是相同的。就我而言,win32
  • 我在需要的地方添加了必要的 extern "C" 和 __declspec(dllexport)。
  • 我已成功编译我的 DLL 并尝试在 C# 项目中引用它。

不幸的是,我收到一条错误消息,告诉我无法添加它,我需要确保它是有效的程序集或 COM 对象。

我已经放弃尝试让我的代码导出,所以我很高兴只有示例“42”通过!

我试过用 dumpbin 查看它,它可以正确导出符号:

1    0 00011023 ??0CEvolutionSimulator@@QAE@XZ
2    1 00011127 ??4CEvolutionSimulator@@QAEAAV0@ABV0@@Z
3    2 00011005 ?GetNumber@CEvolutionSimulator@@QAEHXZ
4    3 0001104B ?fnEvolutionSimulator@@YAHXZ
5    4 00017128 ?nEvolutionSimulator@@3HA

我的大脑中没有任何想法。有人可以启发我吗?无论我尝试什么,我似乎都会收到此错误。

【问题讨论】:

  • 抱歉格式化。以前从未这样做过。我不知道为什么编辑不喜欢我的缩进:(
  • 感谢编辑,paqogomez!
  • 一种常见的方法是使用 C# 项目可以直接引用的 C++/CLI(托管 C++)“胶水”项目。在该托管 C++ 项目中,您可以调用本机 DLL 的函数。
  • 很久以前我也遇到过类似的问题。通过使用 Dependency Walker,我发现这些函数没有被导出。我真的不得不添加一个包含所有导出函数的 *.def 文件。从此时起,这些方法在 Dependency Walker 中可见,并且 DllImport 工作正常

标签: c# c++ .net dllimport dllexport


【解决方案1】:

您需要使用 DllImportAttribute 从 .NET 代码中调用驻留在 C++ DLL(使用 extern "C" 导出)中的函数。不能像 .NET 程序集一样引用 C++ DLL,也不能使用 DLL 中的类,只能使用 DllImported C 类函数。

来自msdn的示例:

using System;
using System.Runtime.InteropServices;

class Example
{
    // Use DllImport to import the Win32 MessageBox function.
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);

    static void Main()
    {
        // Call the MessageBox function using platform invoke.
        MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
    }
}

【讨论】:

  • 我现在已经尝试过这种方法,但它声称它找不到我的测试函数的入口点。再一次,我已经验证我正在使用 dumpbin 正确导出函数。当然,一切都是公开的和静态的。我什至将 DLL 的副本放在我的构建文件夹中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 2011-03-04
  • 1970-01-01
相关资源
最近更新 更多