互操作系列文章:
.NET简谈互操作(一:开篇介绍)
.NET简谈互操作(二:先睹为快)
.NET简谈互操作(三:基础知识之DllImport特性)
.NET简谈互操作(四:基础知识之Dispose非托管内存)
.NET简谈互操作(五:基础知识之Dynamic平台调用)
.NET简谈互操作(六:基础知识之提升平台调用性能)
.NET简谈互操作(七:数据封送之介绍)
本人最近在学习非托管C++互操作的技术,有点小收获不敢私藏拿出来跟大家分享;作为.NET开发人员,我们有必要学习一些互操作方面的知识;尤其对一些高级程序员来说,掌握非托管的互操作能很好的增加我们的技术竞争力;由于互操作的内容很多,我打算用系列来讲,这篇就当是随便唠叨做入门介绍吧;
.NET平台的相关基础知识我就不浪费时间讲了,直接进入主题吧;.NET是在操作系统上的一层软件开发框架,是在Windows平台上的抽象封装,将复杂的软件开发过程简单化,让我们摆脱复杂重复的技术难点进行高效的应用系统开发;但是在工作过程中我们经常会遇到一些调用Win32的相关操作,比如跟用户界面相关的接口调用User32.dll框架,一些内核处理Kernel.dll框架,这些都是平台提供给我们的接口;要想软件在计算机上运行起来,不管多少层封装、多少层抽象最终还是要将我们编写的代码转换成机器码才能成功运行软件,只是减轻了我们程序员的工作量;[王清培版权所有,转载请给出署名]
1:
由于.NET应用程序是托管的,运行在受限的CLR环境中,所有的内存分配回收等等都是CLR负责管理;这样既有好处也有坏处,我们无法用程序来为所欲为,只能用.NET提供给我们的功能来编写,在没有P/Invoke(平台调用)的情况下,我们能做的事情真的很好,微软也考虑到如果.NET不提供对过去的Windows平台上技术的支持,必然将大大妨碍.NET技术的发展,对于一些成熟的技术如:COM(组件对象模型)、OLE(复合文档)、用户界面(User32)、内存管理(Kernel)等等都提供了很好的支持,而且相当简单,我们能很方便的进行调用非托管技术;[王清培版权所有,转载请给出署名]
要想很好的利用P/Invoke(平台调用)进行互操作,我们不单单要懂.NET平台的相关技术,我们也需要对非托管的技术有个简单的了解,比如C++中的变量的内存占用和非托管的内存占用大小区别、C++中的字符编码与.NET中的字符编码区别;任何两种不同技术之间的区别不仅仅是我们表面看上去的那些东西,更重要的在于它的运行与内存分配;在我们学习平台调用的时候,我们需要花上一点时间去学习一些非托管技术,比如COM的内存分配方法CoTaskMemAlloc,C++的内存分配NEW,C的内存分配malloc,这些分配方法的不同导致托管的封送拆收器的处理不同;进行互操作的时候,更多需要考虑的是两者之间的等价处理,如变量的内存大小布局是否一致;在托管中调用非托管代码返回一个指针类型,我们用IntPtr接受,然后用MarShal封送拆收器的帮助类,来进行对象转换;我讲的这些只是互操作中的冰山一角,当我们能熟练进行平台调用的时候我们所开发的软件类型将大大增加,不单单是Winform和asp.net之类的,我们也可以用.NET来开发一些大型的网络系统,更重要的是我们可以用.NET来开发一些部分.NET程序员望而却步的软件,同样是.NET程序员,这样一来我们就比同行多了一些筹码;
总结:这篇主要是简单介绍互操作要涉及的知识面,可能我这短短的几句话很难说清楚互操作的一些技术问题,不要急,请继续关注本人,下面我们将具体介绍互操作中的实质性的技术操作;