c#(winform)环境下使用动态链接库dll的详解

网友投稿 904 2022-05-30

c#(winform)环境下使用动态链接库dll的详解

c#(WinForm)环境下使用动态链接库dll的详解

转载  2016年05月14日 10:12:17

3208

1,什么是dll文件?

DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。

2,托管dll和非托管dll区别是什么?

托管DLL就是能够在公共语言运行库(Common Language Runtime,简称CLR)中能够直接引用的,并且扩展为“DLL”的文件。具体所指就是封装各种命名空间所在的DLL文件,如System.dll等。非托管DLL就是平常所的动态链接库等,其中就包括了封装所有Windows API函数的DLL文件。各种非托管DLL中的函数在公共语言运行库中不能直接被调用,而需要经过.Net框架提供的“平台调用”服务后才可以。(简而言之就是.net环境下生成的动态链接库为托管dll,相反则为非托管dll)

3,托管dll和非托管dll如何使用?

托管dll在VS环境下使用相对容易,可以在项目名上右击选择添加应用的方式导入dll,本文这里不作详解。非托管dll的使用步骤及如下:

1,需要检查使用的dll的目标平台(Any Cpu,x86,x64),在项目属性生成选项卡中选择与dll相对应的目标平台。因为托管dll是在.net的环境下生成的,转换为机器语言后能够自动识别目标平台即有框架支持解释,而非托管不能够自己识别需要人为的设置。

2,使用DllImport导入非托管dll。

3)、环境变量目录。(即需要将dll及依赖文件放到3个目录中的任何一个目录中)。

4)、必须引入System.Runtime.InteropServices命名空间。

ThrowOnUnmappableChar     控制对转换为 ANSI '?' 字符的不可映射的 Unicode 字符引发异常。

4,c#与c++、c动态链接库的参数如何对应?

C C# 备注

short int16 短整型

int int32 整型

long int64 长整型

& ref 取地址

* ref 指针

c#中修饰符ref、out的作用及功能

ref 要求参数在传递给函数前要初始化,out则不需要,常见于平台调用中。out和ref传递的都是引用而不是值,out侧重于输出使用之前不需赋值而ref在使用之前需要赋值,另外这两个关键字可以变相实现使一个方法输出多个值。ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,ref是有进有出,out是只出不进。说明是引用的传递。

example:

//命名空间

using System.Runtime.InteropServices;

//导入非托管dll

//分配的库处理和连接到数控指定的IP地址或主机名。

[DllImport("Fwlib64.dll", EntryPoint = "cnc_allclibhndl3", CallingConvention=CallingConvention.Cdecl)]

//short (const char *ipaddr, unsigned short port, long timeout, unsigned short *FlibHndl)

private static extern Int16 cnc_allclibhndl3(ref String ip, UInt16 port, Int64 timeout, ref UInt16 flibHndl);

在阅读代码时,经常会看到函数声明的形参会有_In_和_out_修饰符,_In_和_out_在这里是宏,它们的实际意思是

_In_           表明这个变量或参数是输入值,即你必须给这个变量填写好以后提交给某个函数去执行

_out_         表明这个是输出值,即你可以传个地址给形参,函数内部会往这个地址写地

这两个宏并不会参与编译,它仅仅是对程序员起到提示作用,让程序员明白如何调用该函数

类似的宏还有

__out          输出参数

__in_opt     可选的输入参数

C#

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:小熊派华为物联网操作系统LiteOS裸机驱动移植01-以LED为例说明驱动移植
下一篇:上海西岸:善感知、会呼吸、有温度的卓越水岸!
相关文章