CLR全面透彻解析:托管和本机代码互操作性

目录

托管和本机代码互操作适用哪种场合?

互操作技术:三种选择

互操作技术:P/Invoke

互操作技术:COM Interop

互操作技术:C++/CLI

互操作体系结构注意事项

API 设计和开发人员体验

互操作边界的性能和位置

生存期管理

托管和本机代码互操作适用哪种场合?

有关使用托管和本机代码互操作适宜时机的论述并不多,现有的论述也以自相矛盾者居多。有时,指南还缺乏实践体验做依据。因此,我先声明我编写的这个指南以我们互操作团队的实践经验为基础,它已向各类内部和外部客户提供过帮助。

在总结这一经验时,我们采纳了三种产品,由它们充当成功使用互操作和典型使用方式的上佳示例。提及互操作时,我首先想到的应用程序就是 Visual Studio Tools for Office,它是 Office 的托管扩展性工具集。它代表互操作的一种典型使用情况——一个想要启用托管扩展或加载项的大型应用程序。另一个就是 Windows Media Center,从一开始,它就是一个混合了托管和本机的应用程序。开发 Windows Media Center 主要使用的是托管代码和本机代码中内置的一些内容,即负责直接处理 TV 调谐器和其他硬件驱动程序的代码段。最后是 Expression Design,一个具备大型预置本机代码库的应用程序,它计划利用 Windows Presentation Foundation (WPF) 这一新的托管技术,提供全新的用户体验。

这三个应用程序解释了使用互操作的三个最普遍的原因:让原有的本机应用程序具备托管扩展性;让应用程序的大部分内容能利用托管代码的优点,同时又能在本机代码中编写最基础的代码段;为现有本机应用程序注入全新的用户体验。

过去,指南中给出的对策是用托管代码彻底重新编写应用程序。采纳这一建议并目睹许多人将其拒之门外之后,您会清楚这一方案对于大部分现有应用程序来说都不适用。互操作非常有助于开发人员维护其在本机代码中的投资,同时还能让他们利用新的托管环境。如果您由于其他原因计划重新编写应用程序,托管代码是个不错的选择。但一般而言,您不想只为使用新的托管技术而重新编写程序,因此也就谈不上互操作。

互操作技术:三种选择

.NET Framework 中有三种主要的互操作技术,具体选用哪种由您用于互操作的 API 类型及控制边界的要求和需要决定。Platform Invoke(或 P/Invoke)基本上是从托管到本机的互操作技术,您可以用它从托管代码调用 C 类本机 API。您还可以使用 COM interop 技术从托管代码使用本机 COM 接口,或从托管 API 导出本机 COM 接口。最后是 C++/CLI(先前称为托管 C++),它允许您创建包含托管和本机 C++ 混合编译代码的程序集,该程序集旨在为托管代码和本机代码搭建起沟通的桥梁。

互操作技术:P/Invoke

P/Invoke 是三种技术中最简单的一个,它的主要功能是让托管代码能访问 C 类 API 。使用 P/Invoke 时,您需要分别封装每个 API。如果要封装的 API 数量不多且其签名也不复杂,这是个不错的选择。但是,如果 API 有很多参数,且这些参数没有好的托管对等项,如变量长度结构、void *、重叠的共同体等,那么 P/Invoke 使用起来会相当难。

.NET Framework 基类库 (BCL) 包含 API 的多个示例,它们就是多个 P/Invoke 声明外部厚实的包装。在包装非托管 Windows API 的 .NET Framework 中,几乎所有功能都是使用 P/Invoke 构建的。实际上,即便是 Windows 窗体,也差不多完全是使用 P/Invoke 在本机 ComCtl32.dll 基础上构建的。

这里有几个非常有用的资源,可以极大地降低 P/Invoke 的使用难度。首先,pinvoke.net 网站上有一个 wiki,最初是由 CLR 互操作团队的 Adam Nathan 设置的,里面有大量由用户为各种通用 Windows API 贡献的签名。

还有非常便于使用的 Visual Studio 加载项,利用它可以轻松从 Visual Studio 访问 pinvoke.net。对于 pinvoke.net 上没有的 API(可能是您自己或他人库中的 API),互操作团队已发布了一个 P/Invoke 签名生成工具,称为 P/Invoke Interop Assistant,它能根据头文件自动为本机 API 创建签名。随附的截图显示了处于使用状态的工具。

时间: 2024-08-02 16:46:10

CLR全面透彻解析:托管和本机代码互操作性的相关文章

CLR全面透彻解析: .NET应用程序可扩展性

借助 Microsoft .NET Framework,编程人员便可轻松获取由不同开发人员和公司构建的组件,并将这 些组件集成到自己的应用程序中.但仅当已知哪些组件是构建基础时才能轻松实现上述过程.如果在构建 时对所需组件一无所知(对于加载项,通常会遇到这种情况),那么事情就会变得更加困难.开发人员在 扩展其应用程序时经常会遇到问题.例如,应将加载项存储在数据库中还是磁盘上?开发人员应考虑已知 接口的加载项以获得激活类型吗?使用 AppDomain.AppDomainManager 和 AppD

CLR全面透彻解析

目录 调整宿主 公开对象模型适配器.约定和加载项视图编写加载项协作加载项总结 您知道现在可以使用新的 Microsoft .NET 加载项框架 (System.AddIn) 创建可扩展的 Windows 窗体应用程序吗?在本期专栏中 ,我将修改 ShapeApp 绘图应用程序,以通过加载项框架公开其对象模型.这将 ,我就能够创建出在宿主应用程序上自动执行任务的加载项(自动化加载项). 另外,我还将讨论此方案以及现有解决方案中的常见问题. 如果您在开始前需要了解有关加载项框架的背景信息,请参阅 C

CLR全面透彻解析: 及早并经常评量性能,第2部分

在上期的"CLR 全面透彻解析"中,我强调要可靠地创建高性能的程序,您需要了解设计 初期所使用的各个组件的性能(msdn2.microsoft.com/magazine/cc424899).这就需要用到性能数据. 因此,测量是设计过程中不可或缺的一部分. 我还在那一期中介绍了一款名为 MeasureIt 的工具,利用它可以轻松地创建新基准,从而快速地收集 制定良好设计决策所需的数据.诸如 MeasureIt 之类的工具所提供的原始数字是极为重要的,另外,使 人们能够了解这些数字的基本含

CLR全面透彻解析: CLR 4中的生产诊断改进

在公共语言运行库 (CLR) 团队,我们有个小组专门提供 API 和服务,供其他人构建托管代码的诊断 工具.我们所拥有(就专用的工程资源而言)的两个最大组件是托管调试和分析 API(分别是 ICorDebug* 和 ICorProfiler*). 与其他 CLR 和框架团队类似,我们也只能通过努力开发应用程序实现我们的价值.例如,Visual Studio 团队会将这些调试和分析 API 用于他们的托管调试器和性能分析工具,还有大量第三方开发人员 在使用分析 API 构建工具. 在过去 10 年

CLR全面透彻解析:大型对象堆揭秘

CLR 垃圾回收器 (GC) 将对象分为大型.小型两类.如果是大型对象,与其相关的一些属性将比对象 较小时显得更为重要.例如,压缩大型对象(将内存复制到堆上的其他位置)的费用相当高.在本月的专 栏中,我将深入探讨大型对象堆.我将讨论符合什么条件的对象才能称之为大型对象,如何回收这些大型 对象,以及大型对象具备哪些性能意义. 大型对象堆和 GC 在 Microsoft .NET Framework 1.1 和 2.0 中,如果对象大于或等于 85,000 字节,将被视为大型对象.此数字根据性能优化

CLR全面透彻解析: 使用CoreCLR编写Silverlight

Silverlight 2 包含对 Windows Presentation Foundation (WPF) UI 框架所做的大量 更改:新控件.丰富的网络 API 和数字版权管理 (DRM) 支持.Silverlight 2 中的一项主要更改就是能 够使用与 Microsoft .NET 兼容的语言编写 Web 客户端.在本文中,我将重点介绍 Silverlight 的开发核心:CoreCLR. 在过去的十几年中,我们已经拥有了许多不同的 Web 编程技术,从 CSS 到 ECMAScrip

CLR全面透彻解析-F#基础

F# 是一种面向对象的新型函数编程语言,用于 Microsoft .NET Framework,已集成到本年度发行的 Microsoft Visual Studio 2010 中.F# 集简单.简洁的语法与高度的静态类型化于一身.这种语言能够胜任的任务从 F# Interactive 中的轻量探索性编程直到使用 Visual Studio 进行的基于 .NET Framework 的大型组件开发. F# 设计为完全在 CLR 上运行.作为一种基于 .NET Framework 的语言,F# 充分

CLR全面透彻解析:CLR中的线程管理

本专栏基于 CLR 线程系统和任务并行库的预发布版本撰写而成.所有信息均有可能发生变更. 当前进行的从单核体系结构到多核体系结构的技术变革带来了诸多好处.举例来说,在线程环境中, 如果有效使用多个线程,便可通过使用多个核和并行性提高性能,例如,使用多线程对数据库进行多个独 立查询的 ASP.NET 应用程序. 但是,使用多个核会带来一些新的问题.您可能会看到编程和同步模型变得更加复杂,您需要控制并 发,而要调整和优化性能将会更加困难.此外,对于影响并发应用程序性能和行为的许多新因素,我们还 不是

CLR全面透彻解析: 提高应用程序启动性能

由于等待应用程序启动是令许多用户都感到沮丧的一件事情,因此,侧重于提高客户端应用程序的启 动性能将极大增强客户的第一印象,并使他们对您的努力成果印象深刻.同时,鉴于启动性能对用户非常 重要,所以值得研究一下其影响因素,这样才能避免最常见的错误. 应用程序启动通常分为冷启动和热启动.在托管应用程序环境中,冷启动是指 Microsoft .NET Framework 系统程序集和应用程序代码均不在内存中时,因而需要从磁盘提取它们.热启动则是指应用程 序的后续启动,或者当大部分系统代码因之前由另一托管