C#调用C++ DLL 中定义的函数
2016-01-09 21:39
417 查看
公司的系统主要是用c#实现的,现在要用到其他公司编写的接口,用c++实现,因此涉及到c#调用c++的部分,已成功调用,现用个简单的例子记录实现过程
创建c++ dll
将此代码编译为dll, vs 2013中, 右键项目->属性,常规中将目标文件扩展名和配置类型改为"dll"
编译好后将生成的dll复制到c#的运行目录下
c#程序调用dll
定义c#中和c++对应的结构体
属性
定义外部方法
注意返回类型为IntPtr,是一个指针, 而非直接的Person结构体, 这里我卡了很久,是因为对两边机制的理解不深导致。 如果直接返回Person, Person中纸包含简单类型(int,doule之类的)不会有问题,但如果包含复杂类型(string, 数组之类的) 则会报 "方法的签名与pinvoke不兼容" 的错误, 之前一直在c#结构体的属性上找出路,没成功,故而改为指针的形式。
调用:
执行,调用成功!!
另外,如果函数中需要传递结构体, c++中传结构体的指针, c#中是将参数定义为IntPtr,然后调用时用StructureToPtr()方法将结构体转成IntPtr,传入调用。
这个问题折腾了我一天,终于解决了,这样就可以让c#顺利调用用c++实现的函数了。希望能对同样困扰于此的小伙伴有所帮助
创建c++ dll
struct Person { char name[5]; int age; }; extern "C" __declspec(dllexport) Person* Test() { Person* p= new Person; strcpy_s(p->name, "beck"); p->age = 32; return p; }
将此代码编译为dll, vs 2013中, 右键项目->属性,常规中将目标文件扩展名和配置类型改为"dll"
编译好后将生成的dll复制到c#的运行目录下
c#程序调用dll
定义c#中和c++对应的结构体
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] struct Person { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)] public string name; public int age; }
属性
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]表示此结构体在内存中是顺序布局,编码为ansi
定义外部方法
[DllImport("InvokeStructSample.dll")] public static extern IntPtr Test();
注意返回类型为IntPtr,是一个指针, 而非直接的Person结构体, 这里我卡了很久,是因为对两边机制的理解不深导致。 如果直接返回Person, Person中纸包含简单类型(int,doule之类的)不会有问题,但如果包含复杂类型(string, 数组之类的) 则会报 "方法的签名与pinvoke不兼容" 的错误, 之前一直在c#结构体的属性上找出路,没成功,故而改为指针的形式。
调用:
IntPtr pPerson = Test(); Person p = (Person) Marshal.PtrToStructure(pPerson, typeof(Person)); Console.WriteLine(p.name); Console.WriteLine(p.age);
执行,调用成功!!
另外,如果函数中需要传递结构体, c++中传结构体的指针, c#中是将参数定义为IntPtr,然后调用时用StructureToPtr()方法将结构体转成IntPtr,传入调用。
这个问题折腾了我一天,终于解决了,这样就可以让c#顺利调用用c++实现的函数了。希望能对同样困扰于此的小伙伴有所帮助
相关文章推荐
- (C++编程规范第17条)避免使用”魔数“
- C++学习笔记41——重载操作符之下标操作符
- C++ DirectX 游戏开发初级视频教程 05 资源下载链接
- struct 结构体笔记
- C++中的new/delete运算符与operator new/operator delete函数
- Sicily 1500. Prime Gap
- C++入门(12):高级OOP技术:重载操作符、多继承和虚继承
- C++拷贝构造函数(深拷贝,浅拷贝)
- C++学习之Pair
- 一起talk C栗子吧(第九十四回:C语言实例--SystemV IPC结构概述)
- iOS学习第四天 C语言 循环语言
- C语言获取时间函数
- c++ 服务端 客户端
- 2015年第六届蓝桥杯B组(C/C++)预赛题目及个人答案
- Sicily 1790. Single Round Match
- C++中cin、cin.get()、cin.getline()、getline()、gets()等
- C语言当中int,float,double,char
- C++笔试题总结(二)
- C语言 类型提升
- Sicily 1753. 解码