无法加载 DLL 'mqrt.dll'

Posted

技术标签:

【中文标题】无法加载 DLL \'mqrt.dll\'【英文标题】:Unable to load DLL 'mqrt.dll'无法加载 DLL 'mqrt.dll' 【发布时间】:2013-09-05 19:01:34 【问题描述】:

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

我在 SERVER1 上有客户端应用,在 SERVER2 上有 MSMQ 和 WCF 服务。

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

SERVER1 和 SERVER2 都运行 Windows Server 2008 R2 Enterprise (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。 另外我建议在客户端机器上重新安装 msmq。 【参考方案1】:

一个明显的旁白;如果您没有安装 Windows 功能 -> Microsoft 消息队列 (MSMQ) 服务器,您将收到此错误。只需转到程序和功能,然后打开或关闭 Windows 功能

【讨论】:

任何人在谷歌上随机搜索此错误,这很可能是问题所在。【参考方案2】:

我并不聪明,但现在一切正常。

在 SO 和 Google 上花费了几个小时后,我最终只是通过编写一个快速控制台应用程序来检查两台服务器上是否安装了 MSMQ,并使用从这里获取的代码...

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

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

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

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

我希望这对将来的某人有所帮助!

【讨论】:

@JohnBreakwell - 抱歉回复晚了。是的,此后两台服务器都已重新启动,并且 WCF 服务已重新启动并按预期工作。 这对我来说毫无意义。简单地检查是否安装了 MSMQ 神奇地解决了您的问题?我遇到了同样的问题,我可以看到 MSMQ 功能已安装并且服务正在运行。我还验证了该 DLL 是否存在于服务器上并且是正确的版本/大小/等。您是否有可能做了其他可能解决问题的事情?比如重启服务器或运行 Windows 更新? @TravisParks - 这对我来说也没有任何意义。我现在不记得有关该问题的所有内容,但是按照我在答案中所说的那样,我确实记得它突然起作用了。我们已经远离 MSMQ/WCF,现在我们使用 RabbitMQ 和 Windows 服务进行发布/订阅,根据我们的需要,这些服务似乎更容易配置、安装和故障排除。 对我来说,只需重新启动服务器即可解决问题。我有两台相同的机器,一台主要机器和一台故障转移机器。此错误在故障转移服务器上随机发生(每 2 或 3 次),但在主计算机上运行良好。我已将 MSMQ Windows 功能安装为软件的一部分,但尚未重新启动机器。显然,它需要它,因为现在错误不再发生。【参考方案3】:

这可能是由于您在 SERVER2 上的服务在 MSMQ 完成自身初始化之前启动并完成其初始化所致。对此进行测试的最简单方法是重新启动托管 WCF MSMQ 终结点的服务。如果 WCF 服务托管在 IIS 中,则弹回应用程序池可能会做同样的事情,但我不确定——我从未处理过 IIS 托管的 MSMQ 端点。

如果重新启动服务可以解决您的问题并且您自己的服务是 Windows 服务,那么您可以将 MSMQ 作为依赖项添加到您自己的服务中,以便它延迟启动,直到 MSMQ 准备好。 This 服务器故障上的答案描述了如何做到这一点。顺便说一句,您要依赖的服务称为“消息队列”

【讨论】:

以上是关于无法加载 DLL 'mqrt.dll'的主要内容,如果未能解决你的问题,请参考以下文章

无法加载 DLL 'sni.dll' - 实体框架核心

windows 无法启动加载内核所需的DLL文件

SQL Server Compact 错误:无法加载 DLL 'sqlceme35.dll'。指定的模块无法找到

无法加载 DLL 'SQLite.Interop.dll

C# 使用 liblas.dll(无法加载 DLL)

SSIS - 无法加载 DLL 'clrcompression.dll':找不到指定的模块