按照将简单的c# DLL转换为COM互操作组件的指导原则,我创建了一个小型的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;
}
我已经创建了一个客户端c#项目,它只是引用了这个COM服务器。这里是问题:COM引用不起作用,在Dependencies->COM部分,它被标记为黄色警告三角形,没有任何进一步的解释,并且来自COM组件的类型在客户端代码中不可用。这些项目发布在github上。注意,COM服务器在重新构建项目时自动注册自己(regasm)。我将感激任何帮助。像"你可以直接引用你的服务器作为。net程序集而不需要使用com"这样的答案是不可接受的,因为这只是我们需要建立的更大工作流的一部分的测试。
在检查编译器警告后发现了不活动引用的原因,并且明确禁止。net客户端引用。net COM服务器。不过,确实存在这样一种可能性,如下所述:https://learn.microsoft.com/en-us/samples/dotnet/samples/out-of-process-com-server/
我检查过了,这确实工作得很好,并且可以让。net客户端从示例中引用Server.Contract.tlb。作为奖励,微软增加了。net Core目标COM服务器加载到COM代理或作为进程外(独立exe)运行的可能性。这确实适用于netcoreapp3.1服务器,因为当我将目标框架更改为net48时,没有DllServer.comhost.dll(包含,最有可能的是代理/存根代码)像netcoreapp3.1一样自动生成,项目属性