由 C# 中的 Windows 服务托管的 COM+ 组件,用于控制外部设备

Posted

技术标签:

【中文标题】由 C# 中的 Windows 服务托管的 COM+ 组件,用于控制外部设备【英文标题】:COM+ Component hosted by Windows Service in C# to control an external device 【发布时间】:2011-03-29 20:08:19 【问题描述】:

我有一个用 C# 编写的 Windows 服务,它控制通过 RS232 连接到计算机的设备(收集数据并允许控制设备)。它被命名为 DeviceService 并且工作正常。现在其他应用程序通过 WCF 服务使用它。

但现在我需要将一些功能公开为 COM+ 组件,以便 C++ 中的应用程序可以与此 windows 服务通信(并从中获取实时数据)。

(我知道可能有更好的方法可以做到这一点,但这是无法更改的要求。必须通过 COM+)。

问题是:当我在 DeviceService 中创建这样一个组件并在客户端上激活它时,它看不到任何数据。例如:Windows 服务 (DeviceService) 中的静态变量为在同一程序集中定义的组件返回 null。就像它是另一个实例/上下文一样。

在 Windows 服务中托管 COM+ 组件的正确方法是什么?所以它们共享相同的上下文(静态变量)。

【问题讨论】:

【参考方案1】:

正确的做法是将 COM+ 组件放在组件服务中并将其标记为多线程。所有实例都将共享相同的静态变量。

【讨论】:

【参考方案2】:

通过Safari Books Online 快速浏览".NET and COM: The Complete Interoperability Guide" 的内容(它基于.NET 1,但COM 互操作并没有太大变化)并没有显示任何内容。

因此我会考虑使用 WCF 创建服务部分,然后创建一个在本地公开 COM 接口的客户端库。 (因此,将 DCOM 和 COM+ 的进程内 COM 代理替换为 COM -> .NET CCR,然后在纯 .NET 中执行其他所有操作。)

客户端库的 COM 接口当然可以注册到组件服务中以被视为 COM+(但除非您提供的功能需要一些 COM+ 服务,否则这并没有太大的作用)。

【讨论】:

这看起来像是一种变通方法,而不是一个好的解决方案。这样的解决方案会提供大量额外的代码。 @nandrew:您已经拥有 WCF 服务器,因此创建一个客户端代理和一组包装器类型(针对通过 COM 公开进行了优化)。 IE。您只需要一组课程(您将需要任何课程)。

以上是关于由 C# 中的 Windows 服务托管的 COM+ 组件,用于控制外部设备的主要内容,如果未能解决你的问题,请参考以下文章

C# Dispose模式

C#-C#中的Dispose模式

托管在 Windows 服务中的 WCF 服务 - 应该由哪一个来完成所有工作?

Windows 服务可以使用由另一个 Windows 服务托管的 WCF 服务吗?

如何诊断由 IIS7 托管的 WCF 服务中的 W3WP.exe 错误

创建要在 C# 中使用的托管 C++ 接口