C# 中的 MSMQ COM API

Posted

技术标签:

【中文标题】C# 中的 MSMQ COM API【英文标题】:MSMQ COM API in C# 【发布时间】:2012-01-04 07:22:51 【问题描述】:

在 C# 中使用 MSMQManagement 的最佳方式是什么?当远程机器断开连接时,我需要能够查看和清除本地传出队列。

显然有些用户可以通过 COM API 做到这一点,但在 COM 引用选项卡中,我没有其他网站/博客/帖子提到的“Microsoft Message Queue 3.0 对象库”(也没有任何类似的东西)。我在机器上搜索过 Interop.MSMQ.dll 也找不到。

我们正在使用 VS 2008 并在 Windows 7 64 位上运行。

我错过了什么?是否有其他机制可以通过“普通”托管类来实现这一点?

谢谢

【问题讨论】:

如果您的 Windows 7 机器上没有安装 MSMQ,请转到控制面板 -> 程序和功能并添加功能 MS MQ... MSMQ 已安装,DCOM 代理也已安装。我可以通过 System.Messaging 类毫无问题地使用 MSMQ 的“正常”功能。当队列另一端的机器与网络断开连接时,我不能做的是清除或查看本地传出队列中的消息。当机器未连接时,这些操作中的任何一个都会抛出 MessageQueueException。 网络上有大量其他开发人员使用 COM API 通过托管代码访问 MSMQManagement 类的示例,该托管代码包含在 System.Messaging 中。这些示例演示如何通过 COM 引用选项卡添加对“Microsoft Message Queue 3.0 对象库”的引用。我没有这个选择。我正在寻找获取此 DLL 的方法,或者至少发现它无法在 Windows 7/Server 2008 上运行。 【参考方案1】:

项目 + 添加参考,浏览选项卡。导航到 c:\windows\system32(或 64 位操作系统上的 syswow64)并选择 mqoa30.tlb。这将创建您正在寻找的 Interop.MSMQ.dll 互操作程序集。请注意,MSMQ 是一个可选的 Windows 组件,如果您的计算机上不存在该文件,则需要先安装它。

【讨论】:

这似乎不起作用(至少在 Visual Studio 2010 中不起作用)。我收到此错误:“无法加载文件或程序集 'mqoa30.tlb' 或其依赖项之一。该模块应包含程序集清单。此文件可能不是托管程序集。” 我已经确认这适用于 Visual Studio 2008 而不是 Visual Studio 2010。我在这里问了一个问题:***.com/questions/9593538/… 当我在 VS2010 中尝试时工作得很好。您没有使用“浏览”选项卡,我无法识别屏幕截图。 我使用的是 Microsoft 的“生产力工具”(visualstudiogallery.msdn.microsoft.com/…)。我猜这个电动工具不允许类型库。我禁用了它,我可以添加引用就好了。【参考方案2】:

您可以通过以下方式从 .NET 本地使用它:System.Messaging.MessageQueue

查看这些文章:

Accessing Message Queues

Reliable Messaging with MSMQ and .NET

【讨论】:

System.Messaging 与 COM API 库不同。 System.Messaging 不允许访问本地传出队列(除非它与另一端在同一台机器上)。 MSMQManagement 类提供了一些机制来做到这一点,但我不知道如何通过托管代码访问它。 作为注释,C# 版本也缺少将相同消息发送到多个队列的可能性(请参阅 MSMQDestination COM 对象)

以上是关于C# 中的 MSMQ COM API的主要内容,如果未能解决你的问题,请参考以下文章

MSMQ 单(队列)对多(侦听器)方案

在 MSMQ 消息中发送具有 BSTR 值类型的 COM 对象

C# MSMQ 无效操作异常

如何在 C# 中使用 MSMQ

如何在C#中使用MSMQ

MSMQ消息队列总结