2013-09-02 45 views
7

Opracowałem usługę WCF, która jest hostowana jako usługa systemu Windows i udostępnia punkt końcowy MSMQ.Nie można załadować biblioteki DLL 'mqrt.dll'

Mam aplikację klienta na SERVER1, a usługa MSMQ i WCF na SERVER2.

Gdy SERWER1/ClientApp próbuje wcisnąć wiadomość do server2 MSMQ, mam następujący errror:

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) 

Zarówno SERWER1 i SERWER2 z systemem Windows Server 2008 R2 Enterprise (6.1 SP1) i oba miały MSMQ zainstalowane za pośrednictwem funkcji Dodaj w Menedżerze serwera.

Rozumiem, że brakuje biblioteki DLL (dość oczywiste z powodu błędu!), Ale nie mam pojęcia, co powinienem zainstalować, aby pobrać bibliotekę DLL tam, gdzie powinna być.

Przeszukanie w Eksploratorze Windows wskazuje, że DLL jest obecny w następujących katalogach na obu serwerach ....

  • 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

Każda pomoc doceniona.

+0

Włącz rejestrowanie fuzji, możesz także spróbować użyć [Dependency Walker] (http://www.dependencywalker.com/) w plikach binarnych. –

+0

Polecam również ponowną instalację msmq na komputerze klienta. –

Odpowiedz

4

Nie jestem mądrzejszy, ale teraz wszystko działa.

Po godzinach na SO i Google, skończyło się tylko sprawdzenie czy MSMQ został zainstalowany na obu serwerach pisząc szybką aplikację konsoli z kodem chwycił stąd ...

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

wpadłem aplikacja konsolowa na serwerach Server1 i Server2, a oba powróciły z wynikiem True to IsMsmqInstalled.

Następnie uruchomiłem moją aplikację i błąd "Nie można załadować biblioteki DLL" mqrt.dll "nie został już zgłoszony.

Nie wiem, czy połączenie z NativeMethods.LoadLibrary("Mqrt.dll"); zarejestrowało bibliotekę DLL lub coś podobnego, ale z pewnością naprawiło to mój problem.

Mam nadzieję, że pomoże to komuś w przyszłości!

+0

Czy nadal działa po ponownym uruchomieniu obu maszyn? –

+0

@JohnBreakwell - przeprosiny za spóźnioną odpowiedź. Tak, oba serwery zostały zrestartowane, a usługi WCF uruchomiły się ponownie i działały zgodnie z oczekiwaniami. – ETFairfax

+0

To nie ma dla mnie żadnego sensu. Po prostu sprawdzenie, czy MSMQ jest zainstalowane w magiczny sposób rozwiązało problem? Występuję w tym samym problemie i widzę, że funkcja MSMQ jest zainstalowana i usługa jest uruchomiona. Sprawdziłem również, czy biblioteka DLL jest obecna na serwerze i czy jest to właściwa wersja/rozmiar/etc. Czy możliwe jest, że zrobiłeś coś, co naprawiło problem? Takich jak ponowne uruchomienie serwera lub uruchomienie aktualizacji systemu Windows? –

1

Może to być spowodowane przez twoją usługę na SERVER2, która uruchamia i kończy jej inicjowanie zanim MSMQ się uruchomi. Najprostszym sposobem na przetestowanie tego jest zrestartowanie usługi hostującej punkt końcowy WCM MSMQ. Jeśli usługa WCF jest hostowana w IIS, być może podskok puli aplikacji zrobi to samo, ale nie wiem na pewno - nigdy nie miałem do czynienia z punktem końcowym obsługiwanym przez IIS MSMQ.

Jeśli ponowne uruchomienie usługi rozwiązuje problem, a Twoja usługa jest usługą systemu Windows, możesz dodać usługę MSMQ jako zależność od własnej usługi, aby opóźnić jej uruchomienie, dopóki program MSMQ nie będzie gotowy. This odpowiedź na stronie Błąd serwera opisuje, jak to zrobić.Nawiasem mówiąc, usługa, od której chcesz polegać, nazywa się "Kolejkowanie wiadomości".

16

Oczywisty bok; Jeśli nie masz zainstalowanej opcji Windows -> Microsoft Message Queue (MSMQ) Server , otrzymasz ten błąd. Po prostu przejdź do Programy i funkcje, a następnie Włącz lub wyłącz funkcję Windows.

+0

jakkolwiek oczywiste ... to pomogło ... – Nova