【问题标题】:COM Interop with IPC in C#COM 与 C# 中的 IPC 互操作
【发布时间】:2014-09-03 16:13:26
【问题描述】:

我有一个关于带有 COM 互操作对象的 IPC 的问题。我想在一个进程中创建和填充数据 COM 互操作对象(例如用 C# 编写的 Windows 服务)。然后我想在另一个进程(C# 中的控制台应用程序)中获取它。我知道 COM 对象不会序列化,它们是非托管代码。我尝试通过 .Net Remoting 实现解决方案(Windows 服务是服务器,控制台应用程序是客户端),但我无法在客户端获取 COM 互操作对象(我在共享库中创建了从 MarshalByRef 继承的 .net 类,使用 COM 互操作创建了公共属性目的)。谁能告诉我,我该怎么办?

【问题讨论】:

  • .NET 并不能完全帮助您编写进程外 COM 服务器。您应该考虑使用 WCF。
  • 我有旧版 COM 对象,我想使用它。

标签: c# .net com ipc com-interop


【解决方案1】:

COM 对象本身是不可序列化的,但是在编写 COM 对象时,您应该使用复杂的代理/存根定义 - 虽然一般来说,卧底,您实际上不必考虑它,特别是如果这些对象是使用某些框架(ATL、delphi、VB6、.NET 等)编写的。

这些代理/存根将在编译时或运行时使用强大的 RPC 机制(或多或少是“DCOM”),如果客户端-服务器通信工作在进程外或跨线程(实际上是 COM“公寓”) .

所有这一切都表明,如果您的 COM 对象是进程内服务器并且已正确构建,COM 会提供免费服务以将它们托管为“COM+ applications”。

通过将 COM 组件的逻辑组创建为 COM+ 应用程序,您可以 可以利用 COM+ 的以下优点: 组件 加载到进程 (DLLHost.exe) 中的动态链接库 (DLL) 托管组件的需求和托管(此处与 .NET 无关)服务器进程。

如果您将对象放在 COM+ 应用程序中,那么您应该能够从 .NET 代码中使用它,就像它在进程中一样,但现在托管在一个特殊的“代理”系统提供的主机进程中(发生这种情况成为著名的 dllhost.exe)。您甚至可以将其配置为完整的 Windows 服务,如下所示在应用程序配置的“激活”选项卡中:

【讨论】:

  • 西蒙,感谢您的回复!因此,如果我们选择将 COM+ 应用程序用作“服务器应用程序”,那么我们是否会有单例 COM 对象?如果不是——谁会在使用对象结束后完成 dllhost.exe 进程?对不起,我是 COM 的菜鸟。
  • 不,它不会是单例。 dllhost 进程回收可以在“Pooling & Recycling”选项卡中配置。我建议您创建一个测试 COM+ 应用程序并在属性对话框中发现众多选项(如我所示)。
【解决方案2】:

如果双方都是 .NET 应用程序,则不应使用 COM。这就像买一辆昂贵的现代汽车,然后骑着马!

首先,您可以使用远程处理。尽管不再受支持,但它很容易实现,我建议不要使用它。无论如何,远程处理不需要 COM Interops。这是一个使用远程处理的简单“Hello World”:http://msdn.microsoft.com/en-us/library/ms973864.aspx

您还可以使用 WCF(Windows 通信基础)。这个更先进,更适合现代应用程序。这是一个带有 WFC 的 Hello World:http://www.codeproject.com/Articles/97204/Implementing-a-Basic-Hello-World-WCF-Service

还有这个:http://blogs.msdn.com/b/jmeier/archive/2007/10/15/how-to-create-a-hello-world-wcf-service-using-visual-studio.aspx

两种技术都支持 IPC、TCP 和 HTTP

【讨论】:

  • 感谢您的宝贵时间!我很乐意放弃 COM 互操作,但我不能=(我知道 WCF,但它使用 SOAP 协议并且 COM 互操作不可序列化。
  • 哦,我明白了。我道歉是因为应该先问:“你为什么坚持使用COM?”可能有办法做到这一点。让我试试。
  • 谢谢哥们,你的观点很好,我很喜欢 :) 当然我的比喻被夸大了,我自己仍然是 COM 的粉丝
  • @Alireza,很高兴我们在同一页上 :)
  • @Zheglov,我想我已经给出了建议,请查看this、this 和this。
猜你喜欢
  • 2011-07-02
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 2012-06-18
  • 2014-09-05
  • 2012-03-24
  • 2010-12-24
  • 2012-06-26
相关资源
最近更新 更多