Import(调用外部非托管动态链接库)

1、Import是System.Runtime.InteropService命名空间下的一个属性类,它的功能是从非托管DLL中暴露函数名称,调用参数,返回结果等必要调用信息。

2、Import["DLL文件路径","x","x"]

DLL文件路径:你所要调用的DLL所在的文件路径,如:C:\\a.DLL;

ps:如果Dll文件在以下路径中,则不需要填写路径,直接写DLL的文件名就行。

DllImport DLL查找顺序:
1、应用程序所在目录
2、Windows目录和Windows\System32目录
3、环境变量目录

3、Import 8个属性

BestFitMapping

将 Unicode 字符转换为 ANSI 字符时,启用或禁用最佳映射, BestFitMapping字段默认为 true。当无意间把Unicode字符转换为危险字符时,例如反斜杠\字符,可能会更改路径。启用最佳映射是将ThrowOnUnmappableChar字段设置为true,通过引发异常来向调用方发出信息。

  • 元素为 ANSI Chars 或 LPSTR 的托管数组传递给非托管安全数组时,无法更改和字段ThrowOnUnmappableChar的默认值。** 始终启用最佳拟合映射,不会引发异常;请注意,这种组合可能会损害安全模型**。

CallingConvention

指定用于传递方法参数的调用约定。 默认值为 WinAPI,该值对应 32 位 Intel 的平台的 __stdcall,分别有5种枚举值。

  • Winapi:此成员实际上不是调用约定,而是使用了默认平台调用约定。 例如:在 Windows x86 上默认为 StdCall,在 Linux x86 上默认为 Cdecl。
  • Cdecl:调用者清理堆栈。这样就可以使用可变参数调用函数使它适合用于接受可变数量参数的方法, 例如Printf。
  • StdCall:被调用者清理堆栈。这是调用非托管类库的默认约定。
  • ThisCall:第一个参数是 this 指针,存储在寄存器 ECX 中。其他参数被推送到堆栈上。此调用约定用于非托管 DLL 类上的方法。
  • FastCall:不支持此调用约定。

CharSet

控制名称重整以及将字符串参数封送到函数中的方式。 默认值为 CharSet.Ansi。

枚举值说明
None该值已过时,具有与System.Runtime.InteropServices.CharSet.Ansi相同的行为。
Ansi封送字符串为多字节字符串:Windows系统默认ANSI代码页,Unix系统默认UTF-8代码页。
Unicode将字符串封送为Unicode 2字节字符串。
Auto为目标操作系统自动编组适当的字符串。

EntryPoint

指定要调用的 DLL 入口点,入口点用于标识函数在DLL中的位置。在托管对象中,我们可以将入口点映射到一个不同的名称,这实际上是对函数的重命名。

public class Win32Api
    {
        [DllImport("user32.dll", EntryPoint = "MessageBoxA")]
        public static extern int MsgBox(int hWnd, String text, String caption, uint type);
    }```

或者也可以按序号来标识入口点。序号以 # 符号为前缀,如 #1。如果省略此字段,则公共语言运行库将使用以DllImport标记的C#方法名称。

public class Win32Api
    {
        [DllImport("user32.dll", EntryPoint = "#1")]
        public static extern int MessageBoxA(int hWnd, String text, String caption, uint type);
    }

ExactSpelling

  • ExactSpelling如果为false时,CharSet设置为CharSet.Ansi ,将调用带有字母 A 的入口点函数名称。
  • ExactSpelling如果为true时, CharSet设置为CharSet.Unicode,将调用带有字母 W 的入口点函数名称。
  • 一般情况下由编译器设置此字段,可忽略设置。

PreserveSig

控制托管方法签名是否应转换成返回 HRESULT 并且返回值有一个附加的 [out, retval] 参数的非托管签名,默认值为 true,即不应转换签名。

SetLastError

允许调用方使用 Marshal.GetLastWin32Error API 函数来确定执行该方法时是否发生了错误。 在 Visual Basic 中,默认值为 true;在 C# 和 C++ 中,默认值为 false。

ThrowOnUnmappableChar

控件引发的异常,将无法映射的 Unicode 字符转换成一个 ANSI?字符。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值