首页 > 解决方案 > 无法引用 C# COM 库

问题描述

按照Turn a simple C# DLL into a COM interop component中的指南,我创建了一个小型 C# COM 服务器:

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("410B8E64-27DB-40BD-8847-FC3A0E96147D")]
public interface IFactory
{
    int PlusOne(int i);
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[Guid("207FC3AB-0EFB-459A-B222-41E281F044F9")]
public class Factory : IFactory
{
    public int PlusOne(int i) => i + 1;
}

我还创建了一个仅引用此 COM 服务器的客户端 C# 项目。这就是问题所在:COM 引用不起作用,在 Dependencies->COM 部分它被标记为黄色警告三角形,没有任何进一步的解释,并且来自 COM 组件的类型在客户端代码中不可用。这些项目发布在 github 上。请注意,COM 服务器在重建项目时自动注册自身(regasm)。我会很感激任何帮助。“您可以直接将您的服务器作为 .net 程序集引用而无需使用 COM”之类的答案是不可接受的,因为这只是对我们需要建立的更大工作流程的一部分的测试。

标签: c#.netcomcom-interop

解决方案


在检查编译器警告后发现了无效引用的原因,并且明确禁止 .Net 客户端引用 .Net COM 服务器。但是,有这样一种可能性,如下所述: https ://docs.microsoft.com/en-us/samples/dotnet/samples/out-of-process-com-server/

我已经检查过了,这真的很好用,.Net 客户端可以从示例中引用 Server.Contract.tlb。作为奖励,Microsoft 增加了将 .Net Core 目标 COM 服务器加载到 COM Surrogate 或作为进程外(独立 exe)运行的可能性。这确实只适用于 netcoreapp3.1 服务器,因为当我将目标框架更改为 net48 时,没有像 netcoreapp3.1 那样自动生成 DllServer.comhost.dll(很可能包含代理/存根代码),该项目属性 <EnableComHosting>true</EnableComHosting> 显然没有任何效果。


推荐阅读