CSharp调用C动态链接库详解
更新时间:2023-12-10 00:54:01 阅读量: 教育文库 文档下载
第一篇编译C的动态连接库
在实际工作中,我们经常会将C语言中的.lib和.h文件(静态库)编译成动态连接库.dll文件(这里只提供这两种文件,没有完整的工程),以提供给其他语言平台调用。
1,必须有.lib文件,只有.h文件是无法编译动态连接库的。
2,我使用的是VS2008,这里打开VS,新建项目—〉win32控制台应用程序,输入项目名称,点击确定,图示如fig.1所示。
Fig.1
3,点击下一步,依次如图fig.2-3所示,最后点击完成,就会生成一个带有.cpp的文件。
Fig.2
Fig.3
4,打开项目—属性—配置属性—链接器—输入,如下图fig.4所示,在附加依赖项中加入你要添加的.lib文件,如果有一些系统.lib库没有添加或出现错误,可以在忽略特定库中添加该库。
注意:如果编译的dll文件调用中出现“xx.dll中找不到函数xx的入口点”,很有可
能是一个xx.def文件没有添加,该文件的内容是EXPORTS 函数名@+序号。如果这个文件中没有你要调用的API 函数,那么你在C#中是调用不到这个函数的,同时这个文件你可以同坐记事本自己编辑,注意!!!
Fig.4
5,在.cpp文件中添加.h文件的引用,不需要把所有的.h文件都引用进去,只需要.lib文件入口相关的.h文件。
6,最后把.lib和.h文件拷贝到工程debug目录里,生成解决方案就Ok了,你会发现.dll在debug目录中出现。
第二篇C#调用C/C++的动态连接库
1,清楚C++与C#类型对应关系,即调用关系:
C基本类型对照关系----VS2008:
除此之外,
c++:HANDLE(void *) ---- c#:System.IntPtr c++:WORD(unsigned short) ---- c#:System.UInt16 c++:DWORD(unsigned long) ---- c#:System.UInt32 c++:结构体 ---- c#:public struct 结构体{}; c++:结构体 &变量名 ---- c#:ref 结构体 变量名 c++:结构体 **变量名 ---- c#:out
c++:GUID ---- c#:Guid c++:UINT8 * ---- c#:ref byte
c++:char*/void*(指向一个字符串) ---- c#:string
对于结构体中的指针数组,对应于C#中的IntPtr[]类型,如: int * a[] -------------- IntPtr[]a 2,清楚在C#中调用C/C++.dll文件的一般格式
using System.Runtime.InteropServices; //必须引用的命名空间 [DllImport(\
public static extern ReturnType FunctionName(type arg1,type arg2,...);
//必须定义为类的静态外部的方法 3,[DllImport(参数)]设定 ①“xx.dll” :dll文件名字
②CharSet :控制调用函数的名称版本及指示如何向方法封送 String 参数。如果 CharSet 字段设置为 Unicode,则所有字符串参数在传递到非托管实现之前都转换成 Unicode 字符。这还导致向 DLL EntryPoint 的名称中追加字母“W”。如果此字段设置为 Ansi,则字符串将转换成 ANSI 字符串,同时向 DLL EntryPoint 的名称中追加字母“A”。
EntryPoint 指示要调用的 DLL 入口点的名称或序号。如果你想使用自己定义的函数名字fucXX,则:”EntryPoint=fucXX”。
③ExactSpelling:指示是否应修改非托管 DLL 中的入口点的名称,以与 CharSet 字段中指定的 CharSet 值相对应。如果为 true,则当 DllImportAttribute.CharSet 字段设置为 CharSet 的 Ansi 值时,向方法名称中追加字母 A,当 DllImportAttribute.CharSet 字段设置为 CharSet 的 Unicode 值时,向方法的名称中追加字母 W。此字段的默认值是 false。
④PreserveSig:指示托管方法签名不应转换成返回 HRESULT、并且可能有一个对应于返回值的附加 [out, retval] 参数的非托管签名。
⑤SetLastError:指示被调用方在从属性化方法返回之前将调用 Win32 API SetLastError。 true 指示调用方将调用 SetLastError,默认为 false。
4,具体实例 C中API函数:
Unsigned long int Fuc (int a,void* b);
C#中定义:
[DllImport(\, ExactSpelling = false)] public extern static UInt32 Fuc(int a, IntPtr b);// C中结构体: #define M 3
typedef struct __tag_MBITMAP{ DWord dwPixelArrayFormat; Long lWidth; Long lHeight;
Long lPitch[MPAF_MAX_PLANES]; Byte* pPlane[MPAF_MAX_PLANES]; }BITMAP
C#定义:
[StructLayout(LayoutKind.Sequential)] //此句在C#中重新定义结构体时一定要加上 public struct BITMAP {
[MarshalAs(UnmanagedType.U4)] public UInt32 dwPixelArrayFormat; [MarshalAs(UnmanagedType.I4)] public Int32 lWidth;
[MarshalAs(UnmanagedType.I4)] public Int32 lHeight;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public Int32[] lPitch;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public IntPtr[] pPlane; //对于结构体中的指针数组,一般采用IntPtr数组 }
对于上面的这个结构体,如果在C/C++中出现了结构体指针,那么我们应该在C#中使用IntPtr类型变量,然后使用如下方法将指针指向结构体。
定义结构体对象S,则在C#中获取结构体指针的方法如下: IntPtr intptr = Marshal.AllocHGlobal(Marshal.SizeOf(S)); Marshal.StructureToPtr(S, intptr, false); //将指针intptr指向结构体
操作之后一定要释放内存——
Marshal.FreeHGlobal(intptr);//释放分配的非托管内存。
反之也可以由指向结构体的指针变量获取结构体。Marshal.PtrToStructure();
正在阅读:
CSharp调用C动态链接库详解12-10
张明楷:绑架罪中“杀害被绑架人”研究03-08
遥感与地理信息系统应用的实习 - 图文03-08
2019年中华人民共和国专利法01-08
优秀物流管理毕业论文09-17
司机标准化作业在地铁运营安全中的作用03-24
广告策划书作业05-10
五行性格测试08-18
十大杰出青年个人评选事迹材料十篇04-21
兄弟离别时说的话02-10
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 调用
- 详解
- 链接
- 动态
- CSharp
- 学习贯彻十七大精神提高政府服务水平心得体会(最新篇)
- 论城投公司的五大特点
- 部编版语文三年级下册第5课《守株待兔》精品教案
- 第四章 消费者行为理论
- 机械基础计算题
- 国际技术与服务贸易(课后参考答案)
- 基础会计课堂练习
- 四川大学《护理研究方法1517》17春在线作业2
- 刑事诉讼法律监督面临 问题及对策(一)
- 作文指导系列教程九5细节描写之“一颦一笑显真情”(人物神态描写)(师用)
- 普通话教学中重点难点音的训练方法探讨与实践
- 潍柴动力专用故障码
- 人教版初中一年级语文下册《 短文两篇》教案
- 小学三年级经典三角形题目
- 没有托福成绩?托福只有70分?还有这些美国大学可以申请!
- 结构可靠性分析试卷及答案
- 企业文化管理办法
- 2015人教版五年级下册语文全册教案(带三维目标)
- 高中地理总复习 课时作业37 世界地理概况 新人教版
- 移多补少60例题