c#调用c语言dll需要注意的事项有哪些

  介绍

小编给大家分享一下c#调用c语言dll需要注意的事项有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

一、将c#工程和c的dll工程放在同一个解决方案下,这样就可以实现联动调试,直接从c#中进入c的dll函数里。注意:每次更改dll中的代码后都必须重新生成dll。另,c#与c中有几种变量类型不对应,注意声明时的区分。

语言c# c类型龙龙长/__int64byte Byteunsigned charchar wchar_t

UInt32size_t

二、dll工程中头文件加入以下代码:

//,此代码为了方便头文件在dll工程和调用该dll的工程中重复利用//,为了方便其他使用者,建议dll开发者定义TESTDLL宏   # ifdef  TESTDLL   # define  DLLAPI  _declspec (dllexport)   其他#   # define  DLLAPI  _declspec (dllimport)   # endif   ,//,此代码为了保证使用C语言编译器编译代码,防止函数名出现其他后缀   ,   # ifdef  __cpluscplus   extern “C", {   # endif   ,//,插入所需导出的代码,例如:   int  DLLAPI  testdll ();   ,   # ifdef  __cpluscplus   }   # endif

三,dll工程中源文件加入以下代码(注意:该代码应该出现于上述头文件之前):

# define  TESTDLL

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

//,导入TESTDLL函数   [DllImport @" . ./. ./. ./调试/testdll.dll",, EntryPoint =,“testdll",, SetLastError =,真的,,CharSet =, CharSet.Ansi,, ExactSpelling =,假,,CallingConvention =, CallingConvention.Cdecl))   ,   extern  static  int  testdll ();

第一个参数是dll文件所在地址,由于该dll与c#工程在同一个解决方案中因此可以写成上述形式;

入口点,函数的名称,可以不写,下面一行有声明,

SetLastError,,指示方法是否保留Win32"上一错误“;

字符集,dll中字符串的表达方式,通常使用Ansi或者Unicode;该设置会将c#中的字符自动转换为设置的方式,例如上述设置会将工程中的字符串转换为Ansi字符;

ExactSpelling,指示入口点是否必须与指示的入口点的拼写完全匹配。

PreserveSig,指示方法的签名应当被保留还是被转换;

CallingConvention,调用惯例,通常C语言使用Cdecl方式CallingConvention,如果该值与dll中的调用方式不一致,通常会造成堆栈不平衡,导段致PInvoke报错,该选项有如下几个值:

Cdecl调用方清理堆栈。这使您能够调用具有,varargs 的函数(如,Printf),使之可用于接受可变数目的参数的方法只FastCall不支持此调用约定.StdCall被调用方清理堆栈。这是使用平台调用调用非托管函数的默认约定只ThisCall 第一个参数是,却;能够指针,它存储在寄存器连成一片中。其他参数被推送到堆栈上。此调用约定用于对从非托管dll导出的类调用方法只Winapi 此成员实际上不是调用约定,而是使用了默认平台调用约定。例如,在Windows上默认为,StdCall,在Windows CE。网络上默认为,Cdecl只

以上是“c#调用c语言dll需要注意的事项有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

c#调用c语言dll需要注意的事项有哪些