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。

DllImport会按照以下3种顺序查找dll文件:
1)、exe所在目录;
2)、System32目录(系统目录);

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

DllImport的导入规则:
1)、方法名与Win API完全一样。如果在C#中调用时显示完全不同的方法名称,则需要引入EntryPoint属性,使用别名显示。
2)、函数除需要DllImport类修饰符外,还需要声明public static extern类型。
3)、函数返回值和参数必须和调用的API的完全一样。

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

DllImport的可选属性参数说明:
EntryPoint         指定要调用的 DLL 入口点。 
SetLastError       判断在执行该方法时是否出错(使用 Marshal.GetLastWin32Error API 函数来确定)。C#中默认值为 false。
CharSet            控制名称及函数中字符串参数的编码方式。默认值为 CharSet.Ansi。
ExactSpelling      是否修改入口点以对应不同的字符编码方式。
CallingConvention  指定用于传递方法参数的调用约定。默认值为 WinAPI。该值对应于基于32位Intel平台的 __stdcall。
BestFitMapping     是否启用最佳映射功能,默认为 true。最佳映射功能提供在没有匹配项时,自动提供匹配的字符。无法映射的字符通常转换为默认的“?”。
PreserveSig        托管方法签
名是否转换成返回 HRESULT,默认值为 true(不应转换签名)。并且返回值有一个附加的 [out, retval] 参数的非托管签名。

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#(winform)环境下使用动态链接库dll的详解相关推荐

  1. linux centos7 mysql_Linux centos7环境下安装MySQL的步骤详解

    Linux centos7环境下安装MySQL的步骤详解 安装MySQL mysql 有两个跟windows不同的地方 1).my.ini 保存到/etc/my.ini 2).用户权限,单独用户执行 ...

  2. django配置环境linux,linux环境下Django的安装配置详解

    linux环境下Django的安装配置详解 1. 下载安装Django pip install Django==1.6.5 测试是否安装成功 >>> import django> ...

  3. MGRE环境下的OSPF (实验超详解)

    一.实验要求 1,r6为isp只能配置ip地址,r1-r5的环回为私有网段 2,r1/4/5为全连的MGRE结构,r1/2/3为星型拓扑结构,r1为中心站点 3,所有私有网段可以互相通讯,私有网段使用 ...

  4. Mac环境下配置tomcat的步骤详解

    前言 相信对Java Web稍微知道一点,一般对Tomcat都不会陌生,Apache是普通服务器,本身只支持html即普通网页,可以通过插件支持PHP,还可以与Tomcat连通(单向Apache连接T ...

  5. Linux/Unix环境下的make和makefile详解

    无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用make工具,我们可以将大型 ...

  6. 压缩命令_Linux环境下文件压缩打包命令详解

    你好,我是goldsunC 让我们一起进步吧! 前言 我们知道,在面向对象的程序设计中,一切皆对象.而在Linux操作系统中,一切皆文件,因此我们总会跟文件打交道. Linux文件系统很庞大复杂,不过 ...

  7. weblogic部署linux静默安装,Linux环境下Weblogic11g中间件-静默安装详解

    第一步: 安装产品 1.配置好java环境变量 java -version查看是否生效,weblogic11g要求最好用1.6以上JDK进行安装配置 2.找到安装介质执行命令:java -jar wl ...

  8. Linux环境下查看日志文件命令详解

    目录: 前言 cat命令 more命令 less命令 head命令 tail命令 tac命令 echo命令 grep命令 sed命令 混合命令 附加 前言: 当日志存储文件很大时,我们就不能用 vi ...

  9. 解决奔腾处理器在tensorflow高版本下报动态链接库(DLL)初始化例程失败

    解决奔腾处理器在tensorflow高版本下报动态链接库(DLL)初始化例程失败 tensorflow高版本(1.5以上)官方貌似只支持AVX2指令集的cpu使用(tensorflow-gpu版本也是 ...

最新文章

  1. JDFlipNumberView
  2. centos怎么切换python版本_centos6更换默认python版本为python3方法
  3. 结合使用位置实参和任意数量实参
  4. python下载文件传到服务器_python实现FTP文件传输的方法(服务器端和客户端)
  5. LINQ之路 5:LINQ查询表达式
  6. 链表之删除链表中间节点
  7. Javascript进阶:数据类型
  8. 谁是“顶会狂魔”?周明、张潼等上榜,清华第四,北大第六 | 2018 ML和NLP顶会论文统计出炉...
  9. 爬虫程序的简单介绍(Python)
  10. AR8035芯片手册 解析|CSDN创作打卡
  11. 一篇荡气回肠的统计思想漫谈——漫谈相关与回归
  12. 从零开始学Java编程!java数据结构面试题
  13. AutoCAD安装失败怎样卸载重新安装AutoCAD,解决AutoCAD安装失败的方法总结【转载】
  14. 运行django项目报错Couldn‘t import Django
  15. cannot import name ‘DistanceMetric‘ from ‘sklearn.metrics‘
  16. 在vc2008中用_crtBreakAlloc调试内存泄漏
  17. 安装MikTex并成功编译中文PPT模板详细过程
  18. 深度学习常见数据集汇总
  19. 01.Win10修改用户名及user文件名称的一波三折
  20. 两段视频合成一个视频用什么软件 怎么把两段视频合成一段看不出来

热门文章

  1. linux无法创建符号链接 权限不够_Linux 基本命令(看完就会系列)
  2. Android开发--图形图像与动画(二)--Animation实现图像的 渐变 缩放 位移 旋转
  3. java模拟银行存取_JAVA基础案例 模拟银行存取款业务
  4. 随风摆动效果_扫盲贴!节目中的AR虚拟效果,使用物理引擎后有什么不同?
  5. java 如何让HashMap变成线程安全的
  6. Java自带的线程池Executors.newFixedThreadPool
  7. java stringbu,Java String和StringBuilder常用方法,
  8. 什么样的编程语言,竟然能融资 1.6 亿?
  9. 聊一聊:Service层你觉得有用吗?
  10. 妙用 Intellij IDEA 创建临时文件,Git 跟踪不到的那种