从C#调用非托管的C++代码

3
我在Win7上使用.NET 4.0运行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

我的脑子已经空了,有人能帮我解决问题吗?无论我尝试什么方法都会出现这个错误。


对于格式问题我很抱歉,这是我第一次这样做。我不知道为什么编辑器不喜欢我的缩进:( - Joseph
感谢您的编辑,paqogomez! - Joseph
一种常见的方法是使用C++/CLI(托管C++)“粘合”项目,该项目可以直接被C#项目引用。在该托管C++项目中,您可以调用本机DLL的函数。 - cdoubleplusgood
我很久以前也遇到过类似的问题。通过使用Dependency Walker,我发现函数没有被导出。我确实需要添加一个包含所有导出函数的*.def文件。从这一点开始,方法在Dependency Walker中可见,并且DllImport工作正常。 - AcidJunkie
1个回答

1
你需要使用 DllImportAttribute 从你的.NET代码中调用存储在C++ DLL中的函数(使用 extern "C" 导出)。你不能像引用.NET程序集一样引用你的C++ DLL,也不能使用来自DLL的类,只能使用 DllImport 的类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的副本放在了我的构建文件夹中。 - Joseph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接