深入探索C#:与ActiveX、COM和非托管代码的交互
1. 非托管代码概述
在C#编程中,代码可分为托管代码和非托管代码。托管代码在公共语言运行时(CLR)的控制下运行,能享受自动内存管理、类型检查和异常处理等CLR提供的功能。例如,我们之前编写的大部分C#代码都属于托管代码。
而非托管代码则在CLR管理环境之外执行,像COM组件、ActiveX接口和Win32 API函数都属于非托管代码。它直接编译成本地代码,无法享受CLR的优势,并且对CLR的存在一无所知。非托管代码具有以下局限性:
- 内存管理、类型检查、异常处理和垃圾回收需在组件内部完成。
- 代码无法移植到其他语言。例如,托管的C#程序可以在VB.NET中调试,但非托管的VB程序无法被C#访问。
- 需要包装组件来与托管的.NET程序集进行通信,这在.NET框架下会带来性能损失。
2. 与非托管代码的互操作性
2.1 互操作性场景
.NET框架提供了与非托管COM组件进行互操作的功能,这些互操作服务可分为以下几种场景:
- .NET程序集(托管)调用单个COM DLL(非托管)
- .NET程序集(托管)调用COM对象或ActiveX控件(非托管)
- COM DLL(非托管)调用.NET程序集(托管)
2.2 托管代码调用非托管COM DLL函数
在C#中,可以使用平台调用服务(PInvoke)来调用Win32 DLL中的公共函数。例如,要调用 user32.dll 中的 MessageBox 函数,可以
超级会员免费看
订阅专栏 解锁全文
153

被折叠的 条评论
为什么被折叠?



