问题描述
|
我有一个不受管理的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 \'中找不到名为\'Add \'的入口点。
我不能更改C ++代码。不知道出了什么问题。
感谢您的帮助。
解决方法
使用PInvoke,您只能调用从Dll导出的全局函数。要使用导出的C ++类,您需要编写C ++ / CLI包装器。这是C ++ / CLI类库项目,它公开了纯.NET接口,在内部将其链接到非托管C ++ Dll,从该Dll实例化一个类并调用其方法。
编辑:您可以从这里开始:http://www.codeproject.com/KB/mcpp/quickcppcli.aspx#A8
, 如果需要创建包装器,请访问swig.org。它将为大多数高级语言(如C#)生成一种语言。
几分钟前,我刚遇到这个程序,却遇到了同样的问题。
, 要使用来自C#的本机C ++的类,您需要在两者之间使用C ++ / CLi包装器,如先前的回答所述。要真正做到这一点,并不是很简单。这里是我的链接,它告诉您如何在更高层次上进行操作:本机C ++的C ++ / CLI包装器在C#中用作参考。
如果您对此不熟悉(像我一样),则可能会偶然发现1)-链接部分。要解决该问题,您可以看到我在这里的操作方式(请参阅我的问题部分):尽管链接了带有导出符号的.lib文件,但链接错误仍从托管C ++链接到非托管C ++。