在 C# 中使用 COM ActiveX DLL 而不引用它
Use COM ActiveX DLL in C# without referencing it
我正在开发一个小型开源项目,该项目使用我无法分发(因此无法引用)的第三方 COM ActiveX Dll。有没有一种简单的方法可以在我的项目中使用这个 DLL 而无需引用它(System.Reflection 程序集似乎不适用于 COM/ActiveX)?或者我应该使用 [DllImport] 将其视为非托管 dll 吗?
谢谢
Is there an easy way to use this DLL in my project without referencing it (System.Reflection Assembly doesn't seem to work with COM/ActiveX) ?
没有。
Or should I treat it as unmanaged dll with [DllImport] ?
通常您将 DllImport
用于 Windows API 等导出函数,但不用于 COM 服务器或 ActiveX 组件。
平台调用是一种服务,它使托管代码能够调用动态 link 库 (DLL) 中实现的非托管函数,例如 Windows API 中的那些。它定位并调用导出的函数,并根据需要跨互操作边界编组其参数(整数、字符串、数组、结构等)。
互操作性使您能够保留和利用对非托管代码的现有投资。 运行在公共语言运行时间(CLR)控制下的代码称为托管代码,运行在CLR之外的代码称为非托管代码。 COM、COM+、C++ 组件、ActiveX 组件和 Microsoft Windows API 是非托管代码的示例。
.NET Framework 通过平台调用服务、System.Runtime.InteropServices 命名空间、C++ 互操作性和 COM 互操作性(COM 互操作)实现与非托管代码的互操作性。
平台调用依赖于元数据来定位导出的函数并在 运行 时间编组它们的参数。下图显示了这个过程。
从 .NET Framework 4 开始,公共语言 运行time 支持将 COM 类型的类型信息直接嵌入到托管程序集中,而不是要求托管程序集从互操作程序集中获取 COM 类型的类型信息.因为嵌入式类型信息仅包括托管程序集实际使用的类型和成员,所以两个托管程序集可能具有相同 COM 类型的非常不同的视图。每个托管程序集都有一个不同的 Type 对象来表示其 COM 类型的视图。通用语言 运行time 支持接口、结构、枚举和委托的这些不同视图之间的类型等价。
类型等效意味着从一个托管程序集传递到另一个托管程序集的 COM 对象可以转换为接收程序集中的适当托管类型。
在 MSDN 的 Interoperability (C# Programming Guide) 部分阅读更多相关信息。
我正在开发一个小型开源项目,该项目使用我无法分发(因此无法引用)的第三方 COM ActiveX Dll。有没有一种简单的方法可以在我的项目中使用这个 DLL 而无需引用它(System.Reflection 程序集似乎不适用于 COM/ActiveX)?或者我应该使用 [DllImport] 将其视为非托管 dll 吗?
谢谢
Is there an easy way to use this DLL in my project without referencing it (System.Reflection Assembly doesn't seem to work with COM/ActiveX) ?
没有。
Or should I treat it as unmanaged dll with [DllImport] ?
通常您将 DllImport
用于 Windows API 等导出函数,但不用于 COM 服务器或 ActiveX 组件。
平台调用是一种服务,它使托管代码能够调用动态 link 库 (DLL) 中实现的非托管函数,例如 Windows API 中的那些。它定位并调用导出的函数,并根据需要跨互操作边界编组其参数(整数、字符串、数组、结构等)。
互操作性使您能够保留和利用对非托管代码的现有投资。 运行在公共语言运行时间(CLR)控制下的代码称为托管代码,运行在CLR之外的代码称为非托管代码。 COM、COM+、C++ 组件、ActiveX 组件和 Microsoft Windows API 是非托管代码的示例。
.NET Framework 通过平台调用服务、System.Runtime.InteropServices 命名空间、C++ 互操作性和 COM 互操作性(COM 互操作)实现与非托管代码的互操作性。
平台调用依赖于元数据来定位导出的函数并在 运行 时间编组它们的参数。下图显示了这个过程。
从 .NET Framework 4 开始,公共语言 运行time 支持将 COM 类型的类型信息直接嵌入到托管程序集中,而不是要求托管程序集从互操作程序集中获取 COM 类型的类型信息.因为嵌入式类型信息仅包括托管程序集实际使用的类型和成员,所以两个托管程序集可能具有相同 COM 类型的非常不同的视图。每个托管程序集都有一个不同的 Type 对象来表示其 COM 类型的视图。通用语言 运行time 支持接口、结构、枚举和委托的这些不同视图之间的类型等价。
类型等效意味着从一个托管程序集传递到另一个托管程序集的 COM 对象可以转换为接收程序集中的适当托管类型。
在 MSDN 的 Interoperability (C# Programming Guide) 部分阅读更多相关信息。