C# Com互操作性

为什么?
掌握了.NET平台下的互操作性技术可以帮助我们在.NET中调用非托管的dll和COM组件。

.NET 平台下提供了3种互操作性的技术:
①Platform Invoke(P/Invoke),即平台调用,主要用于调用C库函数和Windows API
②C++ Introp, 主要用于Managed C++(托管C++)中调用C++类库
③COM Interop, 主要用于在.NET中调用COM组件和在COM中使用.NET程序集。

什么情况下要进行平台调用?
①.NET类库中没有提供相关API然而Win32 API 中提供了相关的函数实现时,此时就可以考虑使用平台调用的技术在.NET开发的应用程序中调用Win32 API中的函数;
  ②由于托管代码的效率不如非托管代码,为了提高效率,此时也可以考虑托管代码中调用C库函数。
平台调用过程:
①查找包含该函数的dll =》②将找到的dll加载到内存 =》③查找函数在内存中的地址并把其参数推入堆栈,来封送所需的数据。CLR只会在第一次调用函数时,才会去查找和加载DLL,并查找函数在内存中的地址 =》 ④执行非托管函数

一、在.NET中使用COM对象,主要有3种方法:
①使用TlbImp工具为COM组件创建一个互操作程序集来绑定早期的COM对象,这样就可以在程序中添加互操作程序集来调用COM对象
②通过反射来后期绑定COM对象
③通过P/Invoke创建COM对象或使用C++ Interop为COM对象编写包装类
下面介绍下使用方法一在.NET 中使用COM对象的步骤:
①找到要使用的COM 组件并注册它。使用 regsvr32.exe 注册或注销 COM DLL。
在项目中添加对 COM 组件或类型库的引用。
②添加引用时,Visual Studio 会用到Tlbimp.exe(类型库导入程序),Tlbimp.exe程序将生成一个 .NET Framework 互操作程序集。该程序集又称为运行时可调用包装 (RCW),其中包含了包装COM组件中的类和接口。Visual Studio 将生成组件的引用添加至项目。
③ 创建RCW中类的实例,这样就可以使用托管对象一样来使用COM对象。

C# Com互操作性_第1张图片
image.png

二、在COM中使用.NET程序集
1、在C#项目中添加互操作特性
可以修改C#项目属性使程序集对COM可见。右键解决方案选择属性,在“应用程序标签”中选择“程序集信息”按钮,在弹出的对话框中选择 “使程序集COM可见” 选项。
2、生成COM类型库并对它进行注册以供COM客户端使用
在“生成”标签中,选中 “为COM互操作注册”选项

你可能感兴趣的:(C# Com互操作性)