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

5
我正在使用.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编写的?

为什么您不想创建一个纯的 .Net 引用?如果将您的类库导出到 COM,它并不会阻止您在 .Net 中使用它。 - Steve B
如果您想进行远程托管,我会直接在.NET或WCF中引用程序集。然后创建一个C#代理,将其导出为普通的COM对象,以便您可以从旧客户端引用它。这样,当非.NET应用程序最终消失时(假设这是您的长期目标),您就有了一个明确的切断路径。 - Albin Sunnanbo
1个回答

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);

将接口移到单独的程序集中并不是必需的,但这样可以减小共享程序集的大小。


这个工作非常出色,只要记住在重新编译时保持接口与运行版本的二进制兼容性即可。 - Sebastian
我不太确定这里...你可以在这里使用Guid创建对象,但我认为它们并没有遵循实际的COM创建过程。由于两者都是托管的,CLR只是绕过了整个COM麻烦,并返回一个普通的C#对象。请参见此处: https://dev59.com/BWUp5IYBdhLWcg3w1aJ7 - schwarz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接