无法加载 DLL 'mqrt.dll'

13

我开发了一个WCF服务,它作为Windows服务托管,并公开了一个MSMQ端点。

我的客户端应用程序在SERVER1上,而MSMQ和WCF服务在SERVER2上。

当SERVER1 / ClientApp尝试将消息推送到SERVER2 MSMQ时,我收到以下错误:

    System.TypeInitializationException: The type initializer for 'System.ServiceModel.Channels.Msmq' threw an exception. ---> System.DllNotFoundException: Unable to load DLL 'mqrt.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
       at System.ServiceModel.Channels.UnsafeNativeMethods.MQGetPrivateComputerInformation(String computerName, IntPtr properties)
       at System.ServiceModel.Channels.MsmqQueue.GetMsmqInformation(Version& version, Boolean& activeDirectoryEnabled)
       at System.ServiceModel.Channels.Msmq..cctor()
       --- End of inner exception stack trace ---
       at System.ServiceModel.Channels.Msmq.EnterXPSendLock(Boolean& lockHeld, ProtectionLevel protectionLevel)
       at System.ServiceModel.Channels.MsmqOutputChannel.OnSend(Message message, TimeSpan timeout)
       at System.ServiceModel.Channels.OutputChannel.Send(Message message, TimeSpan timeout)
       at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
       at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
       at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [7]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at FacilityManager.Service.NotificationsProcessorServiceReference.INotificationsProcessor.SendNewReactiveTaskNotifications(NewReactiveTaskDataContract newReactiveTaskDataContract)

服务器1和服务器2都运行Windows Server 2008 R2企业版(6.1 SP1),并且通过在服务器管理器中添加功能安装了MSMQ。

我知道DLL文件丢失(从错误信息中可以很明显地看出来!),但我不知道应该安装什么才能将DLL放到它应该在的位置。

在Windows资源管理器中搜索显示,以下目录在两台服务器上都有这个DLL文件...

  • C:\Windows\System32
  • C:\Windows\SysWOW64
  • C:\Windows\winsxs\x86_microsoft-windows-msmq-runtime-core_31bf3856ad364e35_6.1.7601.17514_none_5768e2ad17453bd6
  • C:\Windows\winsxs\amd64_microsoft-windows-msmq-runtime-core_31bf3856ad364e35_6.1.7601.17514_none_b3877e30cfa2ad0c

感谢您的任何帮助。


打开融合日志,同时您可以尝试在二进制文件上使用Dependency Walker - Chris O
1
我建议您在客户端机器上重新安装 MSMQ。 - tom redfern
3个回答

25

一个显而易见的注意事项; 如果您没有安装 Windows 功能 -> Microsoft 消息队列 (MSMQ) 服务器,那么您将会遇到这个错误。只需转到 程序和功能 ,然后 打开或关闭 Windows 功能


任何随意谷歌这个错误的人,很可能就是这个问题。 - Chris

5

虽然我对此仍不明白,但现在问题已经解决。

在 Stack Overflow 和 Google 上花费了数小时后,我最终通过编写一个快速控制台应用程序并使用此处提供的代码检查了两个服务器上是否都安装了 MSMQ......

https://stackoverflow.com/a/16104212/192999

我在 Server1 和 Server2 上运行了这个控制台应用程序,两者都返回 IsMsmqInstalled 的 True 结果。

然后我运行了我的应用程序,"无法加载 DLL 'mqrt.dll'" 错误不再出现。

我不知道调用 NativeMethods.LoadLibrary("Mqrt.dll"); 是否注册了 DLL 或其他什么,但它肯定解决了我的问题。

希望这可以帮助未来的某个人!


@JohnBreakwell - 抱歉回复晚了。是的,两台服务器都已经重新启动,并且WCF服务已重新启动并按预期工作。 - ETFairfax
这对我来说毫无意义。仅仅检查MSMQ是否安装就神奇地解决了你的问题?我遇到了同样的问题,我可以看到MSMQ功能已经安装并且服务正在运行。我还验证了DLL在服务器上是否存在,并且是正确的版本/大小等。你有可能做了其他事情来解决这个问题吗?比如重启服务器或运行Windows更新? - Travis Parks
@TravisParks - 对我来说也没有意义。我现在记不起关于这个问题的所有细节,但我记得按照我在答案中所说的做法突然之间就解决了。我们已经放弃了MSMQ/WCF,现在使用RabbitMQ和Windows服务进行发布/订阅,对于我们的需求来说,这似乎更容易配置、安装和排除故障。 - ETFairfax
对我来说,简单地重新启动服务器就解决了问题。我有两台完全相同的机器,一台是主服务器,另一台是备份服务器。这个错误在备份服务器上随机发生(每2或3次),但在主服务器上完美运行。我已经安装了MSMQ Windows功能作为软件的一部分,并且还没有重新启动机器。显然,它需要重新启动,因为现在错误不再发生。 - Travis Parks

1
这可能是由于您在SERVER2上的服务启动并完成初始化之前,MSMQ已经完成了初始化。测试的最简单方法是重新启动托管WCF MSMQ端点的服务。如果WCF服务托管在IIS中,也许弹出应用程序池会有同样的效果,但我不确定--我从未处理过托管在IIS上的MSMQ端点。
如果重新启动服务解决了问题,并且您自己的服务是Windows服务,则可以将MSMQ添加为您自己的服务的依赖项,以便它会延迟启动直到MSMQ准备就绪。Server Fault上的答案描述了如何执行此操作。顺便说一下,您想要依赖的服务称为“消息队列”。

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