与非托管代码的互操作
CLR 提供3种与非托管代码的交互方案:
■ 托管代码通过使用 P/Invoke 机制 来调用DLL文件中的非托管函数
许多 FCL 中定义的类型内部都有调用到 Kernel32.dll, User32.dll 等等文件中的函数。同时许多程序语言会提供托管代码调用非托管代码的简便途径,比如 C# 程序能够直接调用 从Kernel32.dll 导出的 CreateSemaphore 函数。
■ 托管代码可使用已存在的 COM 组件(服务器)
为这些COM 组件生成一个托管程序集(它提供了该COM 组件的详细描述),其他的托管程序就能通过使用该生成的托管程序集进行互操作。详细请参考.NET Framework SDK 中的 TlbImp.exe 工具。 如果碰巧手头没有该工具,或者你想对 TlbImp.exe 生成的代码有更多自定义,你可以手工建立实现互操作功能的源代码。例如:你能在 C# 程序中使用 DirectX COM 组件。
■ 非托管代码可使用托管类型 (服务器)
为托管代码生成一个 COM 组件是最简单的方法。请参考.NET Framework SDK 中的 TlbExp.exe 和 RegAsm.exe工具。
提示:Microsoft 已经公开了以上工具 (Type Library Importer tool 以及 P/Invoke Interop Assistant tool)的源代码,请访问 http://CLRInterop.CodePlex.com/
随着 Windows 8 的发布,Microsoft 导入了新的 Windows API: Windows Runtime (WinRT)。这个 API 内部也是通过 COM 组件来实现,但是由于使用了ECMA 标准metadata来描述这些COM 组件,几乎所有WinRT API 都能被托管代码直接使用。