知识大全 浅谈.NET互操作技术 重点托管代码
Posted 知
篇首语:科学的自负比起无知的自负来还只能算是谦虚。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 浅谈.NET互操作技术 重点托管代码相关的知识,希望对你有一定的参考价值。
浅谈.NET互操作技术 重点托管代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
多年来在程序设计领域微软技术一直引领着每个时代 在每一代的技术背后都有相关的动机 而这些动机及其实现细节往往是大部分的程序设计课程没有涉及的 但是对于我们理解相关的技术又十分重要 本文将对几种相关技术和隐藏在动机背后的细节做简要的阐述 算是抛砖引玉
技术于 年首次发布 称得上是微软技术的一个里程碑 其意义在于使组件编程化得以实现 技术最初的思想起源于将类做成可重用的二进制组件 把类的实现和接口分离以便把类的实现封装到二进制防火墙的背后 而这道防火墙以VPTR和VTBL的形式保证了这个防火墙的不变性……NET技术则在语言层面上支持了基于组件的程序设计 相对于技术 NET技术就是为基于组件的程序设计而生的 所以其编码效率和语言可读性要高出一个等级 但是由于 年以后的十多年时间里 人们利用基于的组件程序设计技术开发了大量的高复杂度 高可用性的代码 并且他们运行良好 效率极高 如果用 NET技术重写这些代码简直就是得不偿失 加之在 NET的实现过程中并不是所有的Windows API都被重写 有些功能是 NET所不能完成的 面对这样的问题 NET互操作技术应运而生 可见需求才是技术的原动力
NET互操作技术主要分为 种 P/Invoke C++ Interop Interop 其中P/Invoke 主要用于调用C库函数和Windows API C++ Interop则主要用于Managed C++调用 C++类库和核心算法库 它甚至允许托管代码和非托管代码在同一个文件中 Interop主要包括正向的RCW和反向的CCW 下面以一个简单的例子对互操作中比较重要的数据封送进行简单的介绍
如何封送字符串(P/Invoke方式)
假设非托管代码定义如下
void _cdecl stringMarshal( const wchar_t* inString wchar_t* outString int buffersize)
If(NULL != inString)
wcscpy_s(outString buffersize inString) 这段代码编译生成的文件名为 stringMarshal dll
在托管代码中其托管定义如下
[DllImport( stringMarshal dll CharSetCharSet = CharSet Unicode CallingConventionCallingConvention =CallingConvention Cdecl)
] public extern static void stringMarshal (string inString StringBuilder outString int bufferSize) 这里有几点需要注意
在声明函数时必须要用extern修饰符 目的是为了告诉编译器此函数是外部实现的 没有方法体 因此不需要在托管代码中搜索这个函数
在声明函数时必须要用static修饰符 原因是非托管的DLL导出的非托管方法都是可以直接调用的 无需对相关的类进行实例化 大部分情况下根本就不存在类
因为非托管代码中的字符串为wchar_t*类型 所以CharSet需要设置为CharSet Unicode
因为非托管代码的调用方式为_cdecl 所以托管部分的CallingConvention需要设置为CallingConvention Cdecl 另外这种类型的调用方式是调用方负责处理堆栈 所以支持可变类型参数函数例如printf()的互操作
输入字符串需要封装为string是因为这个字符串属于固定字符串 互操作过程中不需要变化 而输出字符串则需要封装为StringBuilder 因为这种字符串默认为具有IN/OUT属性 其内容可变 而且当字符串经常需要变化时效率高
托管代码中调用非托管代码方式如下
private static void TestStringMarshal ()
string inString = Wally input test string int bufferSize = inString Length StringBuilder strbd = new StringBuilder(bufferSize) stringMarshal (inString strbd bufferSize + ) Console WriteLine( Wally Input string inString) Console WriteLine( Wally output string strbd ToString()) 总结
cha138/Article/program/net/201311/13285相关参考
Java和.NET互操作究竟有什么用? 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 并非所有的
MicrosoftSyncFramework(MSF)为我们提供了进行同步应用开发的基础框架和API这些API即有基于托管代码的也有基于非托管代码的也就是说我们既可以开发基于NET平台使用托管AP
C#ADO.NET操作数据代码汇总 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一.用SqlC
Asp.Net用OWC操作Excel的实例代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!这篇文
知识大全 深入.NET托管堆(managedheap)(1)
深入.NET托管堆(managedheap)(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
ASP.NET技巧:非托管COM组件的使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 众所周
Visual中的XMLWebservices入门 目录 简介用托管代码编写的XMLWebservices使用VisualStudio创建XMLWebservices使用VisualStudio
ASP.NET技术中常见问题详细解答及代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 怎样实
C和C++有很多好的类库的沉淀在NET中完全抛弃它们而重头再来是非常不明智的也是不现实的所以我们经常需要通过Pinvoke来使用以前遗留下来的非托管的dll就NET中使用非托管的dll经验而言经常
表空间有数据字典和本地托国两种管理模式如果采用数据字典来维护的话发生在数据库的段上并关系到盘区分配的操作(如扩展一个表)将会导致对数据字典的操作如果有很多带有盘区的表被操作时数据字典将会成这些操作