我有一个非托管的C ++ dll,我无法访问代码但是有所有方法声明。
为简单起见,请注意.h看起来像这样:
#include <iostream>
#ifndef NUMERIC_LIBRARY
#define NUMERIC_LIBRARY
class Numeric
{
public:
Numeric();
int Add(int a, int b);
~Numeric();
};
#endif
和.cpp文件中的方法实现
int Numeric::Add(int a, int b)
{
return (a + b);
}
我只想在C#代码中用C ++调用add函数:
namespace UnmanagedTester
{
class Program
{
[DllImport(@"C:\CPP and CSharp Project\UnmanagedNumeric\Debug\numeric.dll", EntryPoint = "Add")]
public static extern int Add(int a, int b);
static void Main(string[] args)
{
int sum = Add(2, 3);
Console.WriteLine(sum);
}
}
}
尝试执行后出现以下错误:
无法在DLL'C:\ CPP和CSharp Project \ UnmanagedNumeric \ Debug \ numeric.dll'中找到名为“添加”的入口点。
我无法更改C ++代码。不知道出了什么问题。 感谢您的帮助。
答案 0 :(得分:6)
使用PInvoke,您只能调用从Dll导出的全局函数。要使用导出的C ++类,需要编写C ++ / CLI包装器。这是C ++ / CLI类库项目,它公开了纯.NET接口,在内部它链接到非托管C ++ Dll,从这个Dll实例化一个类并调用它的方法。
修改:你可以从这开始:http://www.codeproject.com/KB/mcpp/quickcppcli.aspx#A8
答案 1 :(得分:2)
如果您需要创建包装器,请查看swig.org。它将为C#等大多数高级语言生成一个。
几分钟前我刚遇到这个程序,同时解决了你的问题。
答案 2 :(得分:2)
要使用C#中的本机C ++类,您需要在它们之间使用C ++ / CLi包装器,如之前的答案所述。要真正做到这一点,它不是很直接。这是我链接,告诉你如何在高级别:C++/CLI wrapper for native C++ to use as reference in C#。
如果你对这个很陌生(像我一样),你可能偶然发现1) - 链接部分。要解决这个问题,你可以看到我在这里做了什么(参见我的问题部分):Link error linking from managed to unmanaged C++ despite linking to .lib file with exported symbols