这篇文章主要介绍了c#调用c语言dll需要注意的地方,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
一、将C#工程和C的dll工程放在同一个解决方案下,这样就可以实现联动调试,直接从C#中进入C的dll函数里。注意:每次更改dll中的代码后都必须重新生成dll。另,C#与C中有几种变量类型不对应,注意声明时的区分。
语言 | C# | C |
类型 | long | long long/__int64 |
byte/Byte | unsigned char | |
char |
wchar_t |
|
UInt32 | size_t |
二、dll工程中头文件加入以下代码:
// 此代码为了方便头文件在dll工程和调用该dll的工程中重复利用
// 为了方便其他使用者,建议dll开发者定义TESTDLL宏
#ifdef TESTDLL
#define DLLAPI _declspec(dllexport)
#else
#define DLLAPI _declspec(dllimport)
#endif
// 此代码为了保证使用C编译器编译代码,防止函数名出现其他后缀
#ifdef __cpluscplus
extern "C" {
#endif
// 插入所需导出的代码,例如:
int DLLAPI testdll();
#ifdef __cpluscplus
}
#endif
三、dll工程中源文件加入以下代码(注意:该代码应该出现于上述头文件之前):
#define TESTDLL
四、C#工程中,需要调用dll函数的文件中加入以下代码:
// 导入testdll函数
[DllImport(@"../../../Debug/testdll.dll", EntryPoint = "testdll", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
extern static int testdll();
第一个参数是dll文件所在地址,由于该dll与C#工程在同一个解决方案中因此可以写成上述形式;
EntryPoint, 函数的名称,可以不写,下面一行有声明;
SetLastError, 指示方法是否保留 Win32"上一错误";
CharSet, dll中字符串的表达方式,通常使用Ansi或者Unicode;该设置会将C#中的字符自动转换为设置的方式,例如上述设置会将工程中的字符串转换为Ansi字符;
ExactSpelling,指示 EntryPoint 是否必须与指示的入口点的拼写完全匹配;
PreserveSig,指示方法的签名应当被保留还是被转换;
CallingConvention,调用惯例,通常C语言使用Cdecl方式CallingConvention,如果该值与dll中的调用方式不一致,通常会造成堆栈不平衡,导致PInvoke报错,该选项有如下几个值:
Cdecl | 调用方清理堆栈。这使您能够调用具有 varargs 的函数(如 Printf),使之可用于接受可变数目的参数的方法。 |
FastCall | 不支持此调用约定。 |
StdCall | 被调用方清理堆栈。这是使用平台 invoke 调用非托管函数的默认约定。 |
ThisCall | 第一个参数是 this 指针,它存储在寄存器 ECX 中。其他参数被推送到堆栈上。此调用约定用于对从非托管 DLL 导出的类调用方法。 |
Winapi | 此成员实际上不是调用约定,而是使用了默认平台调用约定。例如,在 Windows 上默认为 StdCall,在 Windows CE.NET 上默认为 Cdecl。 |
以上就是c#调用c dll需要注意的地方的详细内容,更多关于c#调用c dll的资料请关注得得之家其它相关文章!
织梦狗教程
本文标题为:c#调用c语言dll需要注意的地方


基础教程推荐
猜你喜欢
- C#通过标签软件Bartender的ZPL命令打印条码 2023-05-16
- C#调用摄像头实现拍照功能的示例代码 2023-03-09
- C#中 Json 序列化去掉null值的方法 2022-11-18
- C#中的Linq to JSON操作详解 2023-06-08
- Unity shader实现高斯模糊效果 2023-01-16
- C#获取指定目录下某种格式文件集并备份到指定文件夹 2023-05-30
- C# 解析XML和反序列化的示例 2023-04-14
- Unity 如何获取鼠标停留位置下的物体 2023-04-10
- 实例详解C#实现http不同方法的请求 2022-12-26
- c# – USING块在网站与Windows窗体中的行为不同 2023-09-20