CLR via C# 3 读书笔记(9):第1章 CLR执行模型 — 1.9 与非托管代码互操作

.NET Framework提供了大量其他开发平台没有的优势。但是,很少有公司能够下决心重新设计和实现既有代码。微软意识到了这一点,使CLR提供了一种机制,允许应用程序由托管和非托管的部分组成。具体来说,CLR支持三种互操作场景:

  • 托管代码调用某个DLL中的非托管函数:托管代码调用DLL(动态链接库)中的非托管函数,可以使用P/Invoke(即Platform Invoke)机制。毕竟,FCL内部定义的很多类型都调用了Kernel32.dll、User32.dll中导出的函数。许多编程语言提供了简化托管代码调用DLL中非托管函数的机制。例如,C#应用程序调用了Kernel32.dll中导出的CreateSemaphore函数。
  • 托管代码使用现有的COM组件:很多公司已经实现了大量的非托管COM组件。利用这些组件中的类型库,可以创建出描述该COM组件的托管程序集。托管代码可以象访问其他托管代码一样访问这些托管程序集中的类型。更多的信息请参见与.NET Framework SDK一起发布的Tlblmp.exe工具。有时候,你可能没有类型库,或者希望对Tlblmp.exe生成的内容有更多的控制。这时,可以在源代码中手动创建自己的类型,CLR可以利用这些类型进行正确的互操作。例如,你可以在C#应用程序中使用DirectX COM组件。
  • 非托管代码使用托管类型:许多现有的非托管代码都需要提供COM组件才能正确运行。用托管代码来实现这些组件要更容易,这样可以避免处理引用计数和COM接口。例如,你可以用C#创建ActiveX控件或shell扩展程序。更多信息请参见随.NET Framework SDK一起发布的TlbExp.exe和RegAsm.exe工具。

微软目前发布了Type Library Importer工具和P/Invoke Interop Assistant工具的源代码,来帮助需要与本地代码交互的开发人员。这些源代码可以在这里下载。

posted @ 2010-03-10 09:28  麒麟.NET  阅读(2000)  评论(0编辑  收藏  举报