[在C#中使用COM ActiveX DLL而不引用它

问题描述 投票:0回答:1

我正在研究一个小型开源项目,该项目使用无法分发(因此无法引用)的第三方COM ActiveX Dll。有没有一种简单的方法可以在我的项目中使用它而不引用它(System.Reflection组装件似乎不适用于COM / ActiveX)?还是应该使用[DllImport]将其视为非托管dll?

谢谢

c# com activex
1个回答
1
投票

是否有一种简单的方法可以在我的项目中使用它而不引用它(System.Reflection汇编似乎不适用于COM / ActiveX)?

没有。

或者我应该使用[DllImport]将其视为非托管dll吗?

通常,您将DllImport用于Windows API之类的导出功能,但不用于COM服务器或ActiveX组件。

平台调用是一项服务,使托管代码能够调用在动态链接库(DLL)中实现的非托管函数,例如Windows API中的那些。它根据需要在互操作边界上定位并调用导出的函数,并将其参数(整数,字符串,数组,结构等)编组。

互操作性使您可以保留和利用非托管代码中的现有投资。在公共语言运行库(CLR)的控制下运行的代码称为托管代码,在CLR外部运行的代码称为非托管代码。 COM,COM +,C ++组件,ActiveX组件和Microsoft Windows API是非托管代码的示例。

。NET Framework通过平台调用服务,System.Runtime.InteropServices命名空间,C ++互操作性和COM互操作性(COM互操作)来实现与非托管代码的互操作性。

平台调用依赖于元数据来定位导出的函数并在运行时将其参数编组。下图显示了此过程。

enter image description here

从.NET Framework 4开始,公共语言运行库支持将COM类型的类型信息直接嵌入到托管程序集中,而不是要求托管程序集从互操作程序集获取COM类型的类型信息。因为嵌入的类型信息仅包含托管程序集实际使用的类型和成员,所以两个托管程序集可能对同一COM类型具有非常不同的视图。每个托管程序集都有一个不同的Type对象来表示其COM类型的视图。公共语言运行时支持接口,结构,枚举和委托的这些不同视图之间的类型等效。

类型等效性意味着从一个托管程序集传递到另一个托管程序集的COM对象可以转换为接收程序集中的适当托管类型。

在MSDN的Interoperability (C# Programming Guide)部分中了解有关此内容的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.