与非托管代码互操作?
为了使得现存的非.NET代码都可用,微软的设计使得CLR可以在应用程序里同时包含托管和非托管代码。CLR支持三种互操作:
托管代码调用DLL(就是我们说的动态链接库)中的非托管函数
托管代码使用现存的COM组建(非托管组建作为COM服务器)
非托管代码使用托管类型(托管类型作为COM服务器)
互操作性
是否可以在 .NET 框架程序中使用 COM 对象?
是。您现在部署的任何 COM 组件都可以在托管代码中使用。通常情况下,所需的调整是完全自动进行的。
特别是,可以使用运行时可调用包装 (RCW) 从 .NET 框架访问 COM 组件。此包装将 COM 组件提供的 COM 接口转换为与 .NET 框架兼容的接口。对于 OLE 自动化接口,RCW 可以从类型库中自动生成;对于非 OLE 自动化接口,开发人员可以编写自定义 RCW,手动将 COM 接口提供的类型映射为与 .NET 框架兼容的类型。
是否可以在 COM 程序中使用 .NET 框架组件?
是。您现在创建的托管类型都可以通过 COM 访问。通常情况下,所需的配置是完全自动进行的。托管开发环境的某些新特性不能在 COM 中访问。例如,不能在 COM 中使用静态方法和参数化构造函数。一般,提前确定给定类型所针对的用户是一种较好的办法。如果类型需要在 COM 中使用,您将被限制在使用 COM 可访问的特性。
默认情况下,托管类型可能是可见的,也可能是不可见的,这由用于编写托管类型的语言决定。
特别是,可以使用 COM 可调用包装 (CCW) 从 COM 访问 .NET 框架组件。这与 RCW(请参阅上一个问题)相似,但它们的方向相反。同样,如果 .NET 框架开发工具不能自动生成包装,或者如果自动方式不是您所需要的,则可以开发自定义的 CCW。
是否可以在 .NET 框架程序中使用 Win32 API?
是。使用 P/Invoke,.NET 框架程序可以通过静态 DLL 入口点的方式来访问本机代码库。
下面是 C# 调用 Win32 MessageBox 函数的示例:
using System;
using System.Runtime.InteropServices;
class MainApp
{
[DllImport("user32.dll", EntryPoint="MessageBox")]
public static extern int MessageBox(int hWnd, String strMessage, String strCaption, uint uiType);
public static void Main()
{
MessageBox( 0, "您好,这是 PInvoke!", ".NET", 0 );
}
}
-----------------------------------------------------------------------------
什么是托管代码和托管数据?
托管代码是为面向公共语言运行库的服务编写的代码(请参阅“什么是公共语言运行库?”)。为了面向这些服务,该代码必须向运行库提供最低级别的信息(元数据)。默认情况下,所有 C#、Visual Basic .NET 和 JScript .NET 代码都受托管。默认情况下,Visual Studio .NET C++ 代码不受托管,但编译器可以通过指定命令行开关 (/CLR) 来产生托管代码。
与托管代码密切相关的是托管数据(由公共语言运行库的垃圾回收器分配和释放的数据)。默认情况下,C#、Visual Basic 和 JScript .NET 数据受托管。然而,通过使用特殊的关键字可以将 C# 数据标记为非托管。默认情况下,Visual Studio .NET C++ 数据不受托管(即使在使用 /CLR 开关时),但在使用 C++ 托管扩展时,可以通过使用 __gc 关键字将类标记为托管。正如名称所暗示的,这意味着用于类实例的内存受垃圾回收器的托管。另外,类成为 .NET 框架社区的一名完全参与的成员,这既带来了好处,也带来了限制。其中一个好处是与用其他语言编写的类的正确互操作性(例如,托管 C++ 类可以从 Visual Basic 类继承)。其中一个限制是托管类只能从基类继承。
--------------------------------------------------------------------------------
什么是公共语言运行时 (CLR)?
公共语言运行时是 .NET 框架应用程序的执行引擎。
它提供许多服务,包括:
代码管理(加载和执行)
应用程序内存隔离
类型安全验证
IL 到本机代码的转换
元数据(增强的类型信息)访问
为托管对象管理内存
强制代码访问安全
异常处理,包括跨语言异常
托管代码、COM 对象和现有 DLL(非托管代码和数据)之间的互操作
自动进行对象布局
对开发人员服务(配置、调试等)的支持
什么是公共类型系统 (CTS)?
公共类型系统是多信息类型系统,它被内置在公共语言运行时中,支持大多数编程语言中的类型和操作。公共类型系统支持大量编程语言的完全实现。
什么是公共语言规范 (CLS)?
公共语言规范是一组结构和限制,用作库编写者和编译器编写者的指南。它使任何支持 CLS 的语言都可以完全使用库,并且使这些语言可以相互集成。公共语言规范是公共类型系统的子集。对于那些需要编写代码供其他开发人员使用的应用程序开发人员,公共语言规范也非常重要。如果开发人员遵循 CLS 规则来设计公共访问的 API,那么就可以在支持公共语言运行时的任何其他编程语言中很容易地使用这些 API。
什么是 Microsoft 中间语言 (MSIL)?
MSIL 是与 CPU 无关的指令集。.NET 框架程序被编译成 MSIL。它包含加载、存储、初始化和调用对象方法的指令。
与元数据和公共类型系统结合,MSIL 允许真正的跨语言集成。
MSIL 在执行前被转换为机器代码,而不是一边解释一边执行。