托管代码与非托管代码

符合.Net框架规范的代码叫做托管代码,反之称为非托管代码。在实际应用中,非托管代码大量地以Windows动态链接库和COM组件的形式存在。.Net框架提供了调用动态链接库中非托管函数的平台调用服务和COM互操作支持。
在托管代码中使用动态链接库中的非托管函数
公共语言运行时通过P/Invoke(平台调用服务)来调用Windows动态链接库中的非托管函数,基本步骤如下:
(1)识别DLL中的函数。至少必须指定函数的名称和包含改函数的DLL的名称。
(2)创建用于容纳DLL函数的类。可以使用现有类,或者为每一个非托管函数创建单独的类,或者创建包含一组相关的非托管函数的一个类。
(3)在托管代码中创建原型。C#使用DllImport特性来标识DLL和函数,用ststic 和extern修饰符来标记导出的方法。
(4)调用DLL函数
例1

 [DllImport("CSCInterface.dll", EntryPoint = "OpenUSB_Board", CallingConvention = CallingConvention.StdCall)]//[]表示特性,用于对程序集的进一步描述
        public static extern int OpenUSB_Board(int deviceIndex, IntPtr handle);      //extern用来声明外部的非托管代码

特点:需要using System.Runtime.InteropServices;
DllImport特性和数据封送是P/Invoke中最关键的两个问题。
DllImport特性
DllImport的主要作用是指示CLR应该从哪个DLL导出想要的函数。指定的DLL名称被作为一个参数传递给DllImport特性的构造函数。
DllImport特性的字段

BestFitMapping切换最适合的映射
CallingConvention指定用于传递方法参数的调用约定。默认为WinAPI,该值对应于基于32位Intel的平台的_stdcall
CharSet控制名称重整及将字符串参数封送到函数中的方式,默认值为: CharSet .Ansi
ExactSpelling控制是否应修改入口点以对应于字符集。对于不同的编程语言,默认值将有所不同
EntryPoint指定调用的DLL入口点

1.EntryPoint
EntryPoint用于指定非托管函数的入口点。入口点用于标识函数在DLL中的位置。可以将入口点映射到不同的名称。例1中,他是映射到相同的函数名字。
2.ChartSet
控制字符串封送处理和确定平台调用DLL中查找函数名所使用的字符集。
确定Windows API是否与字符集有关,可以通过Platform SDK中检查该函数的C语言头文件。如果发现该API函数确实定义为一个映射到以A或W结尾的函数名的宏,则调用的函数肯定与字符集有关。
A:ChartSet.Ansi
W:ChartSet.Unicode
3.SetLastError
用于指定错误处理的方式

数据封送
字符串封送处理的关键是了解字符串参数的传递方向,即只用做输入还是用做输入/输出。基本准则:
(1)只用于输入:则使用String类型。
(2)如果字符串参数可以用做输入和/或输出。则使用StringBuilder类型。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值