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") == )
{
strncpy(szBuffer,"输入的是type1\r\n",nBuffSize);
}else if(strcmp(cszBuffer,"type2") == )
{
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 ;
}
这里导出了三个函数,分别用来测试简单类型参数传递,字符串传递以及测试函数回调。
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(, ).ToString();
} //测试dll中的字符串
private void button2_Click(object sender, EventArgs e)
{
string strText = "";
StringBuilder sb = new StringBuilder();
CSharpTestString("type1", sb, );
strText += sb.ToString();
CSharpTestString("type2", sb, );
strText += sb.ToString();
CSharpTestString("sss", sb, );
strText += sb.ToString();
sb = null;
textBox1.Text = strText;
} //给dll调用的回调
private int CSharpCallBackFun(string str)
{
textBox1.AppendText(str);
return ;
}
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工程文件下载地址。
C#调用C++编写的dll的更多相关文章
- C#调用C++编写的DLL函数, 以及各种类型的参数传递 (转载)
C#调用C++编写的DLL函数, 以及各种类型的参数传递 1. 如果函数只有传入参数,比如: C/C++ Code Copy Code To Clipboard //C++中的输出函数 int ...
- C#动态调用C++编写的DLL函数
C#动态调用C++编写的DLL函数 动态加载DLL需要使用Windows API函数:LoadLibrary.GetProcAddress以及FreeLibrary.我们可以使用DllImport在C ...
- 使用clr 调用C#编写的dll中的方法的全解释
使用clr 调用C#编写的dll中的方法的全解释1.数据库初始化:将下面这段代码直接在运行就可以初始化数据库了exec sp_configure 'show advanced options', '1 ...
- 通过C#去调用C++编写的DLL
这个问题缠了我2个小时才弄出来,其实很简单.当对方提供一个dll给你使用时,你需要去了解这个dll 是由什么语言写的,怎么编译的,看它的编译类型.这样即使在没有头绪时,你可以先尝使用一些比较热门的编译 ...
- C++项目中采用CLR的方式调用C#编写的dll
1.注意事项:在编写C#DLL类库时,最好不要出现相同的命名空间,否则在C++中调用可能会出现编译错误.2.将C#的源码生成的“dll”文件复制到C++项目中的Debug目录下3.将C++项目属性设置 ...
- Delphi7调用DelphiXE编写的DLL问题
http://bbs.csdn.net/topics/380045353 用DelphiXE在WIN2008下编写一个访问WebServices的DLL ws.dll,只有一个输出函数,如下: fun ...
- Delphi 调用C# 编写的DLL方法
近来,因工作需要,必须解决Delphi写的主程序调用C#写的dll的问题.在网上一番搜索,又经过种种试验,最终证明有以下两种方法可行: 编写C#dll的方法都一样,首先在vs2005中创建一个“ ...
- C# 调用delphi编写的dll
技术实现 如何逐步实现动态库的加载,类型的匹配,动态链接库函数导出的定义,参考下面宏定义即可: #define LIBEXPORT_API extern "C" __declspe ...
- PB调用C#编写的DLL
C#以其简单易用,功能强大深受大家喜爱.PowerBuilder作为C/S的MIS开发工具,十分简单灵活,开发时间短,开发及维护成本低,一直是中小企业信息管理系统的首选开发工具.但是PB的局限性限制了 ...
随机推荐
- ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(八)之 聊天记录入队(列)
本篇也算是个番外篇了,跟之前几篇关系不算大.之前一篇 RabbitMQ .NET Client 实战实验 里有介绍过今天要用的内容. 做了一下小更改,就是在用户聊天的时候,消息记录不直接进入数据库, ...
- 原生ajax接收json字符串(简单介绍)
什么是json? JSON的全称是 Javascript Object Notation(javascript对象表示法),是基于javascript对象字面量,如果单从眼睛看,JSON里的数据是被保 ...
- MVC5 Attribute(特性)
AuthorizeAttribute:一般用来判断权限 ActionFilterAttribute:方法执行前后动作 OutputCacheAttribute:输出缓存设置 注:我们创建名称的时候请带 ...
- LINUX日志的错误等级
LINUX日志的错误等级 - CSDN博客 https://blog.csdn.net/solmyr_biti/article/details/50634533讯息等级 系统将讯息分为七个主要的等级, ...
- java中泛型的简单使用
泛型是在jdk1.5之后引入的,我们可以在类的声明处增加泛型列表,如:<T,E,V>.此处,字符可以是任何标识符,一般采用这3个字母. 1.泛型类声明 class MyCollection ...
- 我的第一个Python程序
#我的第一个Python程序 def is_valid_date(strdate): #判断是否是一个有效的日期字符串 try: #判断是否是时间格式 if ":" in strd ...
- code ELIFECYCLE (代码周期)
问题:build 不成功 解决:新建一个dist 文件,没有自动新建dist 文件 问题 :npm run dev 时候 解决:
- (暴力碾标算)NOIP模拟赛 宗教仪式
题意: 一个模式串,一个文本串,现定义最大失配值为k 求文本中最大失配值<=k的长度为len(模式串)的字串个数 失配值=当前字串中与模式串不同的字符个数 思路: 暴力,加一个跳出剪枝,居然过了 ...
- yum仓库客户端搭建和NTP时间同步客户端配置
一.yum仓库客户端搭建 yum源仓库搭建分为服务器端和客户端. 服务端主要提供软件(rpm包)和yumlist.也就是提供yum源的位置.一般是通过http或者ftp提供位置. 客户端的配置:yum ...
- 尚硅谷SpringBoot项目学习源码记录
链接:https://pan.baidu.com/s/1aNUL1QlHMhDIFtWGhC1mtQ 密码:793v