无法加载DLL'mqrt.dll'

时间:2013-09-02 16:05:11

标签: wcf dll windows-server-2008 msmq

我开发了一个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窗口-MSMQ-运行时core_31bf3856ad364e35_6.1.7601.17514_none_5768e2ad17453bd6
  • C:\的Windows \ WINSXS \ Amd64_microsoft窗口-MSMQ-运行时core_31bf3856ad364e35_6.1.7601.17514_none_b3877e30cfa2ad0c

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:21)

显而易见;如果您没有 Windows功能 - >安装了Microsoft Message Queue(MSMQ)服务器,然后您将收到此错误。只需转到程序和功能,然后打开或关闭Windows功能

答案 1 :(得分:5)

我不是更聪明,但事情现在正在发挥作用。

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

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

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

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

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

我希望这有助于将来的某个人!

答案 2 :(得分:1)

这可能是由于SERVER2上的服务启动并在MSMQ初始化之前完成初始化。测试此方法的最简单方法是重新启动托管WCF MSMQ端点的服务。如果WCF服务托管在IIS中,也许弹跳应用程序池也会做同样的事情,但我不确定 - 我从未处理过IIS托管的MSMQ端点。

如果重新启动服务可以修复您的问题并且您自己的服务是Windows服务,则可以将MSMQ作为依赖项添加到您自己的服务中,这样它就会延迟启动,直到MSMQ准备就绪。服务器故障上的This答案描述了如何执行此操作。顺便提一下,您想要依赖的服务称为"消息队列"