c++编写的dll和c#调用
C++ written dll and C# call
长时间阅读后,我没有得到dll工作…
我试了很多不同的方法,但都没用。
我做了以下事情:(IDE: VS2013Ultimate)
-
我添加了一个干净的c++项目。在那里我添加了一个头文件[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# Console Application:
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(); } } }
请帮帮我。不知道该怎么办……对不起,我的英语不好。
编辑:有一个错误:System。Klassen_Tester.exe中的DllNotFoundException。找不到DLL "CppClassDll.dll"。
您可以考虑在c++和c#之间使用互操作,这样您就不必与pinvoke混淆了。我并不是说调用不好,而是说互操作很好。
你想要写一个CLR包装器作为托管和非托管代码之间的中介。看起来你已经写了c#和c++的大部分,所以我将描述CLR部分。
- 在Visual Studio中创建CLR项目
- 添加本地c++项目作为参考
- 编写包装器
- 从c#项目中添加CLR项目的引用
- 调用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:
相关文章:
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- Visual c ++,使用字符串引用/指针调用 dll 函数
- 调用 "project" 函数和调用 DLL 函数之间的区别
- 从C++调用dll实现的JNI
- 调用 dll 函数时"Run-Time Check Failure #0 - The value of ESP"
- Java 调用 dll 字符串返回类型方法
- #VALUE!在 64 位 Excel 中调用 DLL 函数 (C++) 时
- 使用 c++ 调用.dll的默认参数的函数
- 从Qt(c ++)调用DLL中的函数
- 如果在调用 DLL 中的函数时没有传递足够的参数,会发生什么情况?
- C++调用 DLL 函数
- 注册和调用 DLL 回调的正确方法是什么
- 无法调用 DLL 中的函数
- C++ CPP 使用参数动态调用 DLL
- 从C++调用dll函数
- 从MS访问中调用DLL函数
- 必须在其他线程上调用 DLL 函数
- 在 C++ 中,如何使用不同库中的相同签名调用 DLL 函数
- Qt 5.2 DLL返回与应用程序调用DLL不同的结果
- 调用dll时从未达到断点