C# 调用C++库函数时,DllImport 参数详解

本文讲述:C# 调用C++库函数时,DllImport 参数详解

[AttributeUsage(AttributeTargets.Method)]
public class DllImportAttribute: System.Attribute
{
   public DllImportAttribute(string dllName) {…} //定位参数为dllName
   public CallingConvention CallingConvention; //入口点调用约定
   public CharSet CharSet;                                   //入口点采用的字符接
   public string EntryPoint;  //入口点名称
   public bool ExactSpelling;   //是否必须与指示的入口点拼写完全一致,默认false
   public bool PreserveSig;  //方法的签名是被保留还是被转换
   public bool SetLastError;  //FindLastError方法的返回值保存在这里
   public string Value { get {…} }
}

1、CharSet:参数指示用在入口点中的字符集;CharSet 参数指示用在入口点中的字符集。如果未指定 CharSet,则使用默认值

Ansi:将字符串封送为Unicode 2字节字符。
Unicode:将字符串封送为多字节字符串。

CharSet:规定封送字符串应使用何种字符集;CharSet是字符集,Encoding是编码
字符集是字符的集合,规定这个集合里有哪些字符,每个字符都有一个整数编号(只是编号不是编码);
编码是用来规定字符编号如何与二进制交互,每个“字符”分别用一个字节还是多个字节存储。

Ansi编码保留了对ASCII编码的兼容,当遇到ASCII字符时,采用单字节存储,当遇到非ASCII编码时,采用双字节表示(GB2312编码)

2、EntryPoint:指示要调用的DLL入口点的名称或序号

C++库,调用函数对应的名称  EntryPoint参数给出dll中入口点的名称。如果未指定EntryPoint,则使用方法本身的名称。

3、CallingConvention:指定调用在非托管代码中实现的方法所需的调用约定

c++   输出的函数调用约定是多种的
1、Cdecl   调用方清理堆栈。 这使您能够调用具有 varargs 的函数(如 Printf),使之可用于接受可变数目的参数的方法。

2、FastCall   不支持此调用约定。     

3、StdCall   被调用方清理堆栈。这是使用平台invoke调用非托管函数的默认约定。     

4、ThisCall   第一个参数是 this 指针,它存储在寄存器 ECX 中。 其他参数被推送到堆栈上。 此调用约定用于对从非托管 DLL 导出的类调用方法。   

5、Winapi   此成员实际上不是调用约定,而是使用了默认平台调用约定。 例如,在 Windows 上默认为 StdCall,在 Windows CE.NET 上默认为 Cdecl。

你可能感兴趣的:(C#,DllImport,参数详解,C#,DllImport,参数)