服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - c#调用c语言dll需要注意的地方

c#调用c语言dll需要注意的地方

2022-11-08 12:20weareu C#

这篇文章主要介绍了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工程中头文件加入以下代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 此代码为了方便头文件在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工程中源文件加入以下代码(注意:该代码应该出现于上述头文件之前):

?
1
#define TESTDLL

四、C#工程中,需要调用dll函数的文件中加入以下代码:

?
1
2
3
4
// 导入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的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/weareu/article/details/81841732

延伸 · 阅读

精彩推荐
  • C#C#使用foreach循环遍历数组完整实例

    C#使用foreach循环遍历数组完整实例

    这篇文章主要介绍了C#使用foreach循环遍历数组,结合完整实例形式较为详细的分析了C#遍历数组的相关技巧,需要的朋友可以参考下...

    梦断难寻9792021-11-29
  • C#c# 实现圆形的进度条(ProgressBar)

    c# 实现圆形的进度条(ProgressBar)

    这篇文章主要介绍了c# 如何实现圆形的进度条(ProgressBar),帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...

    Hello——寻梦者!4222022-11-03
  • C#浅谈c#中config.exe 引发的一些问题

    浅谈c#中config.exe 引发的一些问题

    下面小编就为大家分享一篇浅谈c#中config.exe 引发的一些问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    我是外婆5722022-02-12
  • C#C# 文件拖拽和pixturBox缩放与拖拽功能

    C# 文件拖拽和pixturBox缩放与拖拽功能

    这篇文章主要介绍了C# 文件拖拽和pixturBox缩放与拖拽功能,代码简单易懂,非常不错具有参考借鉴价值,需要的朋友可以参考下...

    孤者自清11442022-01-25
  • C#详解c# SpinWait

    详解c# SpinWait

    这篇文章主要介绍了c# SpinWait的相关资料,帮助大家更好的理解和学习c# 编程,感兴趣的朋友可以了解下...

    温暖如太阳5222022-10-12
  • C#UGUI轮播图组件实现方法详解

    UGUI轮播图组件实现方法详解

    这篇文章主要为大家详细介绍了UGUI轮播图组件的实现方法,支持自动轮播、手势切换等功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    阿循4072022-07-09
  • C#C# 如何使用ajax请求

    C# 如何使用ajax请求

    这篇文章主要介绍了C# 如何使用ajax请求,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    时光巷尾6162022-09-28
  • C#C#实现Windows Form调用R进行绘图与显示的方法

    C#实现Windows Form调用R进行绘图与显示的方法

    众所周知R软件功能非常强大,可以很好的进行各类统计,并能输出图形。下面介绍一种R语言和C#进行通信的方法,并将R绘图结果显示到WinForm UI界面上的方...

    JackWang-CUMT8882021-12-27