c# c语言 dll 字符串,c#调用c语言dll需要注意的地方

本文介绍了如何在C#工程中调用C的DLL,包括将两者放在同一解决方案下实现联动调试,DLL头文件和源文件的修改,以及C#中导入DLL函数的语法。关键点包括DLLAPI定义、调用约定、字符集设置和函数声明。同时,注意C#与C类型间的对应问题,如long、byte、char等。
摘要由CSDN通过智能技术生成

一、将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的资料请关注脚本之家其它相关文章!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值