C#调用C++编写的dll
界面还是C#写的方便点,主要是有一个可视化的编辑器,不想画太多的时间在界面上。但是自己又对C++了解的多一些,所以在需要一个良好的界面的情况下,使用C++来写代码逻辑,将其编译成一个dll,然后用C#写界面,
1.C++编写的dll代码如下:
extern "C" __declspec(dllexport) int testAdd(int a,int b) { return a+b; } //一个简单测试字符类型的例子 extern "C" __declspec(dllexport) void testString( const char* cszBuffer, char* szBuffer, int nBuffSize) { if(strcmp(cszBuffer,"type1") == 0) { strncpy(szBuffer,"输入的是type1\r\n",nBuffSize); }else if(strcmp(cszBuffer,"type2") == 0) { strncpy(szBuffer,"输入的是type2\r\n",nBuffSize); }else { strncpy(szBuffer,"other type\r\n",nBuffSize); } } //回调函数类型定义 typedef int (CALLBACK *PMYCALLBACKFUN)( const char* msgs); extern "C" __declspec(dllexport) int testCallBack(PMYCALLBACKFUN fun) { fun("dll中输出的字符串\r\n"); return 0; }
这里导出了三个函数,分别用来测试简单类型参数传递,字符串传递以及测试函数回调。
2.C#中调用代码如下:
//这里根据dll中的函数名填写 [DllImport("testdll.dll", EntryPoint = "testAdd", CallingConvention = CallingConvention.Cdecl)] private static extern int CSharpTestAddFun(int a, int b); [DllImport("testdll.dll", EntryPoint = "testString", CallingConvention = CallingConvention.Cdecl)] private static extern int CSharpTestString(string str, StringBuilder sb, int size); public delegate int MyTestCallBackFun(string str); [DllImport("testdll.dll", EntryPoint = "testCallBack", CallingConvention = CallingConvention.Cdecl)] private static extern int CSharpTestCallBack(MyTestCallBackFun fun); //测试dll中加法函数 private void button1_Click(object sender, EventArgs e) { textBox1.Text = CSharpTestAddFun(1, 2).ToString(); } //测试dll中的字符串 private void button2_Click(object sender, EventArgs e) { string strText = ""; StringBuilder sb = new StringBuilder(100); CSharpTestString("type1", sb, 100); strText += sb.ToString(); CSharpTestString("type2", sb, 100); strText += sb.ToString(); CSharpTestString("sss", sb, 100); strText += sb.ToString(); sb = null; textBox1.Text = strText; } //给dll调用的回调 private int CSharpCallBackFun(string str) { textBox1.AppendText(str); return 0; } private void button3_Click(object sender, EventArgs e) { CSharpTestCallBack(CSharpCallBackFun); }
调用过程简单点就是先定义导出函数:
[DllImport("testdll.dll", EntryPoint = "testAdd", CallingConvention = CallingConvention.Cdecl)] private static extern int CSharpTestAddFun(int a, int b);
这样就可以在C#中使用这个函数了。
复杂点就是字符串传递了。
C# string对应C++中的const char*
C# StringBuilder对应C++中的char*
3.测试程序
按钮1按下,调用dll中的加法函数:
按钮2按下,调用字符串传递函数:
按钮3按下,调用Dll中的测试回调函数:
4.文件下载
相关VS2010工程文件下载地址。