您的位置:首页 > 编程语言 > C语言/C++

C#调用C++编写的dll

2015-11-17 15:33 585 查看
界面还是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工程文件下载地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: