C#中调用Dll动态链接库
起始
受限于语言的不同,我们有的时候可能会用别人提供的函数及方法
或者其他的什么原因、反正就是要调!!!
恰巧别人所使用的的语言跟自己又不是一样的
这个时候想要调用别人的函数库就需要借用一些别的东西了
今天我们要说的是“UnmanagedExports”
当前我所要实现的目的只是为某一QQ机器人编写插件
但我又不喜欢某中文编程语言,编程习惯导致 233333
在这里我们还可以使用进程间UDP通信来解决这个问题(编写插件的问题)
但是这种方法局限性比较大,操作起来又略显繁琐
所以今天介绍一下“UnmanagedExports”这个nuget包
经过
打开nuget包管理器,为你所在的项目的安装上这个包,这里就不在复述了
之后便可以以类似下面的写法来调用Dll
首先需要声明需要调用的函数及其对用的Dll
[DllImport("user32.dll")]//DllImportAttribute
public static extern int MsgBox(int hWnd, String text, String caption, uint type);
这里告诉编译器我们需要调用的Dll名称及其对应的方法定义
使用“extern”关键字来标识这个方法是从外部引用
关于“DllImportAttribute”的属性会在下面讲到
DllImportAttribute详解
DllImportAttribute是一个重要的角色,其主要作用是给CLR指示哪个Dll是需要调用的外部库。
字段
说明
BestFitMapping
启用或禁用最佳匹配映射。
CallingConvention
指定用于传递方法参数的调用约定。 默认值为 WinAPI,该值对应于基于 32 位 Intel 的平台的 __stdcall。
CharSet
控制名称重整以及将字符串参数封送到函数中的方式。 默认值为 CharSet.Ansi。
EntryPoint
指定要调用的 DLL 入口点。
ExactSpelling
控制是否应修改入口点以对应于字符集。 对于不同的编程语言,默认值将有所不同。
PreserveSig
控制托管方法签名是否应转换成返回 HRESULT 并且返回值有一个附加的 [out, retval] 参数的非托管签名。默认值为 true(不应转换签名)。
SetLastError
允许调用方使用 Marshal.GetLastWin32Error API 函数来确定执行该方法时是否发生了错误。 在 Visual Basic 中,默认值为 true;在 C# 和 C+