经过漫长的阅读时间后,我没有让dll正常工作...... 我尝试了很多不同的方法,但没办法......
我做了以下事情:(IDE:VS2013Ultimate)
我添加了一个干净的c ++项目。在那里我添加了1个头文件[header.h]:
#pragma once
class myClass{
public:
myClass(double varx, double vary);
double sumxy();
private:
double x;
double y;
};
我添加了一个body.cpp文件:
#pragma once
#include "header.h"
myClass::myClass(double varx, double vary){
x = varx;
y = vary;
}
double myClass::sumxy(){
return x + y;
}
这就是我需要的所有代码。我只想要一个有效的示例代码。
我添加了一个类[main.cpp]:
#include "header.h"
#include "body.cpp"
extern "C" __declspec(dllexport) double sumxy(double var_x, double var_y){
myClass MC(var_x, var_y);
return MC.sumxy();
}
在此之后我编译了这个dll并且我没有任何编译错误。 `我将它复制到c#控制台应用程序的调试文件夹
C#控制台应用程序:
using System.Runtime.InteropServices;
//all using directories
namespace Klassen_Tester {
class Program {
[DllImport("CppClassDll.dll")]
public static extern double sumxy(double var_x, double var_y);
static void Main(string[] args) {
Console.WriteLine(sumxy(3, 5).ToString());
Console.ReadLine();
}
}
}
请帮帮我。不知道该怎么做..抱歉我的英语不好。
编辑:Klassen_Tester.exe中存在错误:System.DllNotFoundException。 DLL" CppClassDll.dll"无法找到。 HRESULT:0x8007007E)无法加载。
答案 0 :(得分:0)
您可以考虑在C ++和C#之间使用互操作,这样您就不必乱用pinvoke。我不是说pinvoke很糟糕但是interops很好。
您将要编写CLR包装器以充当托管代码和非托管代码之间的中介。看起来你主要编写了C#和C ++,所以我将描述CLR部分。
使用您的C ++签名创建一个类,如下所示:
namespace YourWrapper
{
public ref class WrappedFunction
{
public:
// Adjust according to your c++ class and function
double sumxy(double a, double b) {
return myClass::sumxy(a, b);
}
};
}
有关完整示例,请参阅我的项目https://github.com/corytodd/interop-example: