DCOM 服务器和客户端均用 .NET 编写

Tho*_*rin 5 .net com dcom tlbimp

我正在.NET 4(VS2010,C#)中开发DCOM服务器。就其本身而言,这工作得很好。

现在,我还需要为此 DCOM 服务器开发一个 .NET 客户端,但我无法添加对 TypeLib 的引用。Visual Studio 会告诉我类型库是从 .NET 程序集导出的,无法添加为引用。

这个问题的答案表明我应该能够用来TlbImp.exe生成包装器程序集,但它也会拒绝这样做:

TlbImp:错误 TI1029:类型库“MyWrapper”是从 CLR 程序集导出的,无法作为 CLR 程序集重新导入。

我知道,从纯粹的 .NET 角度来看,为此使用 DCOM 可能没有多大意义。但是,同一服务器也应该可以从非 .NET 应用程序访问。

我尝试过将 tlb 转换为 IDL 并从中重新生成 tlb,但这并不能欺骗 Visual Studio。

也许可以在重新生成之前稍微修改 IDL,或者是否有某种方法强制使用 DCOM,即使服务器和客户端都是用 .NET 编写的?

Tho*_*rin 3

我设法让 DCOM 工作,但我不确定它是否可以从 TypeLib 完成。修改IDL允许我导入类型库,但最终在编译过程中失败了(尽管这被Visual Studio视为警告)。仍然可以对文件进行更多修改,但我使用的是更简单的解决方案。

DCOM 服务器的所有接口定义都移至单独的程序集,然后直接从 .NET 客户端引用。这避免了导入问题。

然后,访问 DCOM 服务器与人们想象的没有什么不同:

Guid clsId = new Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX");
Type type = Type.GetTypeFromCLSID(clsId);
IMyInterface comObject = (IMyInterface)Activator.CreateInstance(type);
Run Code Online (Sandbox Code Playgroud)

将接口移动到单独的程序集并不是绝对必要的,但这可以最大限度地减少共享程序集的大小。