向 COM 公开 .NET Core 组件Exposing .NET Core components to COM
本文内容
在 .NET Core 中,与 .NET Framework 相比,向 COM 公开 .NET 对象的过程已明显简化。下面的过程将引导你如何向 COM 公开类。本教程介绍了如何:
- 从 .NET Core 向 COM 公开类。
- 生成 COM 服务器作为构建 .NET Core 库的一部分。
- 自动为无注册表 COM 生成并行服务器清单。
系统必备Prerequisites
- 安装 .NET Core 3.0 SDK 或更高版本。
创建库Create the library
第一步是创建库。
- 创建新文件夹,并在该文件夹中运行以下命令:
dotnet new classlib
打开
Class1.cs
。将
using System.Runtime.InteropServices;
添加到文件顶部。创建名为
IServer
的接口。例如:
using System;
using System.Runtime.InteropServices;
[ComVisible(true)]
[Guid(ContractGuids.ServerInterface)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IServer
{
/// <summary>
/// Compute the value of the constant Pi.
/// </summary>
double ComputePi();
}
将
[Guid("<IID>")]
属性添加到接口,包含要实现的 COM 接口的接口 GUID。例如[Guid("fe103d6e-e71b-414c-80bf-982f18f6c1c7")]
。请注意,此 GUID 必须唯一,因为它是 COM 的此接口的唯一标识符。在 Visual Studio 中,可通过转到“工具”>“创建 GUID”以打开“创建 GUID”工具来生成 GUID。将
[InterfaceType]
属性添加到接口,并指定接口应实现的基本 COM 接口。创建用于实现
IServer
的名为Server
的类。将
[Guid("<CLSID>")]
属性添加到类,包含要实现的 COM 类的类标识符 GUID。例如[Guid("9f35b6f5-2c05-4e7f-93aa-ee087f6e7ab6")]
。与接口 GUID 一样,此 GUID 必须唯一,因为它是 COM 的此接口的唯一标识符。将
[ComVisible(true)]
属性添加到接口和类。
重要
与 .NET Framework 不同,.NET Core 要求指定想要通过 COM 激活的任何类的 CLSID。
生成 COM 主机Generate the COM host
- 打开
.csproj
项目文件并在<PropertyGroup></PropertyGroup>
标记中添加<EnableComHosting>true</EnableComHosting>
。 - 生成项目。生成的输出将具有
ProjectName.dll
、ProjectName.deps.json
、ProjectName.runtimeconfig.json
和ProjectName.comhost.dll
文件。
为 COM 注册 COM 主机Register the COM host for COM
打开提升的命令提示符,然后运行 regsvr32 ProjectName.comhost.dll
。这将使用 COM 注册所有公开的 .NET 对象。
启用 RegFree COMEnabling RegFree COM
- 打开
.csproj
项目文件并在<PropertyGroup></PropertyGroup>
标记中添加<EnableRegFreeCom>true</EnableRegFreeCom>
。 - 生成项目。生成的输出现在还将具有
ProjectName.X.manifest
文件。此文件是用于无注册表的 COM 的并行清单。
示例Sample
GitHub 上的 dotnet/samples 存储库中有一个正常运行的 COM 服务器示例。
附加说明Additional notes
与 .NET Framework 不同,.NET Core 不支持从 .NET Core 程序集生成 COM 类型库 (TLB)。对于接口的本机声明,必须手动编写 IDL 文件或 C++ 标头。
此外,不支持将 .NET Framework 和 .NET Core 加载到同一进程中,因此,不支持将 .NET Core COM 服务器加载到 .NET Framework COM 客户端进程,反之亦然。