非托管代码调用.NET托管代码示例

需积分: 15 4 下载量 77 浏览量 更新于2024-09-20 收藏 956B TXT 举报
"本文将探讨如何使用非托管代码(如C++)来访问和调用由.NET Framework生成的托管代码(如C#编写的类库)。通过实例展示了一个C++程序调用C#动态链接库(DLL)中的方法,演示了非托管与托管代码之间的交互过程。" 在.NET Framework中,托管代码是指被CLR(Common Language Runtime)管理和执行的代码,它享有诸如内存管理、异常处理和类型安全等服务。非托管代码则相反,通常指C、C++或其他不依赖于.NET Framework运行时的编程语言编写的应用程序。在某些情况下,我们需要从非托管代码(如已存在的C++程序)中调用.NET Framework中的功能。这可以通过使用.NET Framework的互操作性功能来实现,比如使用COM Interop或使用.NET Framework的公共语言运行时(CLR)接口。 本示例中,非托管的C++代码使用`ICLRRuntimeHost`接口来启动CLR并执行托管代码。`ICLRRuntimeHost`是.NET Framework提供的一种机制,允许非托管代码控制CLR的行为,例如启动、停止运行时,以及在特定的应用域中执行托管代码。 首先,C++代码包含了必要的头文件(`Windows.h`, `MSCorEE.h`),并链接了`mscoree.lib`库,这是.NET Framework的入口点。然后,通过`CorBindToRuntimeEx`函数,C++程序与CLR建立了连接,并获取了`ICLRRuntimeHost`接口的实例。 一旦与CLR建立连接,`Start`方法被调用,以初始化运行时环境。接下来,使用`ExecuteInDefaultAppDomain`方法,非托管代码能够在默认的应用域内执行托管代码。这个方法接受几个参数,包括托管DLL的名称(`test.dll`)、类名(`test.MyType`)、方法名(`TestMethod`)以及一个方法参数(`TestStringParam`)。当这个方法成功执行后,返回值被存储在`retVal`中,然后在控制台输出。 对应的C#代码定义了一个名为`MyType`的类,包含一个静态方法`TestMethod`,这个方法接受一个字符串参数并返回其长度。当C++代码调用`ExecuteInDefaultAppDomain`时,`TestMethod`会被执行,输出相应的信息,并返回字符串的长度。 总结来说,非托管代码访问托管代码的关键在于利用.NET Framework的互操作性特性,通过接口如`ICLRRuntimeHost`来控制和调用托管环境中的功能。这使得我们可以灵活地集成现有非托管应用与.NET Framework的强大力量,实现跨语言和跨平台的解决方案。