【发布时间】:2021-12-01 16:46:05
【问题描述】:
按照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 组件的类型在客户端代码中不可用。 这些projects are published on github。 请注意,COM 服务器会在项目重建时自动注册自身(regasm)。 我会很感激任何帮助。诸如“您可以直接将您的服务器作为 .net 程序集引用而无需使用 COM”之类的答案是不可接受的,因为这只是对我们需要建立的更大工作流程的一部分的测试。
【问题讨论】:
-
看起来原因是由我首先忽略的编译器警告解释的,“警告 MSB3290 无法为类型库创建包装程序集 .... 类型库 'x86TestComServer' 是从CLR 程序集,并且不能作为 CLR 程序集重新导入。”因此,Microsoft 明确禁止这样做,即使我之后要在 Com_Surrogate 上托管 ComServer 并且不将其作为 inproc 加载。
-
对于引用 .NET 对象,如果此 .NET 对象是 COM 对象,则必须将 .NET 对象作为常规 .NET 引用而不是 COM 引用来引用。
-
是的,我知道。这可以防止在 COM 代理进程中运行 .Net COM 服务器,这是我们的目标,因为服务器必须是 32 位,而客户端是 64 位。
-
顺便问一下,我的帖子有什么问题,为什么被否决了?问题表述清楚,有代码示例,网上没有很好的解释……奇怪。很高兴了解“-”-ed的人的推理。
-
在您的问题中没有提到进程外、代理、32 与 64 位或类似的东西。你说你知道你不能从 .NET 中引用 .NET,但这就是你在你的问题中想要做的,所以你应该更准确地解释你想要做什么。 PS:FWIW 我没有投反对票
标签: c# .net com com-interop