Исключение шины NService при обработке onStart, когда сборка зависит от Automapper - PullRequest
3 голосов
/ 21 апреля 2011

У нас есть сборка, использующая ссылку на Automapper.dll.Запуск NServiceBus при сбое подписчика начинается со следующего сообщения:

Exception when starting endpoint, error has been logged. Reason: Could not load file or assembly 'file:///D:\Main\Src\Core\Core.MessageHandler\bin\Debug\AutoMapper.dll' or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x80131515)

StackTrace:

Server stack trace: 
       at Magnum.StateMachine.ExceptionActionDictionary`1.HandleException(T stateMachine, Event event, Object parameter, Exception exception)
       at Magnum.StateMachine.EventActionList`1.Execute(T stateMachine, Event event, Object parameter)
       at Magnum.StateMachine.EventActionBase`1.Execute(T instance, Event event, Object parameter)
       at Magnum.StateMachine.State`1.RaiseEvent(T instance, BasicEvent`1 eevent, Object value)
       at Magnum.StateMachine.StateMachine`1.RaiseEvent(Event raised)
       at Topshelf.Internal.ServiceController`1.Start()
       at Topshelf.Internal.IsolatedServiceControllerWrapper`1.Start()
       at Topshelf.Internal.ServiceControllerProxy.Start()
       at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
       at System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(RuntimeMethodHandle md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
       at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)

    Exception rethrown at [0]: 
       at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
       at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
       at Topshelf.Internal.ServiceControllerProxy.Start()
       at Topshelf.Internal.FacadeToIsolatedServiceController`1.Start()
       at Topshelf.Internal.ServiceCoordinator.Start()
       at Topshelf.Internal.Hosts.ConsoleHost.Run()
       at Topshelf.Internal.Actions.RunAsConsoleAction.Do(IRunConfiguration configuration)
       at Topshelf.Runner.Host(IRunConfiguration configuration, String[] args)
       at NServiceBus.Host.Program.Main(String[] args)

Файл "Automapper.dll" существует!В Конфиге нет проблем.Я проверил это, удалив зависимость от AutoMapper.dll, и он работает.

Вот конфиг:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="MsmqTransportConfig" 
             type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
    <section name="Logging" type="NServiceBus.Config.Logging, NServiceBus.Core" />
  </configSections>

  <MsmqTransportConfig 
    InputQueue="MyQueue@localhost" 
    NumberOfWorkerThreads="1" 
    MaxRetries="10" 
    ErrorQueue="ErrorQueue@localhost" />

  <Logging Threshold="WARN" />

</configuration>

Есть идеи?Известны ли проблемы с зависимостями AutoMapper в NServiceBus?

Ответы [ 2 ]

4 голосов
/ 21 апреля 2011

В вашем классе конфигурации конечной точки (IConfigureThisEndpoint) обычно также реализуется IWantCustomInitialization. В рамках этой пользовательской инициализации вы можете указать следующее:

public void Init()
{
    Configure.With(AllAssemblies.Except("Automapper.dll"))
        .AutofacBuilder()
        .Log4Net(); // etc.
}

Код "AllAssemblies.Except ()" указывает конфигурации NServiceBus полностью игнорировать сборку Automapper.

Еще одна потенциальная проблема, которая может вызвать проблему, если вы используете NServiceBus.Host.exe, скомпилированный для CLR v2.0 (.NET v3.5), в то время как Automapper скомпилирован для CLR v4.0 (.NET 4,0). Существует несколько сборок NServiceBus в зависимости от вашей версии CLR. Возможно, вам придется попробовать запустить версию Automapper для CLR v4.0, чтобы она стала версией .NET 3.5 (которая, я считаю, активно не разрабатывается).

1 голос
/ 22 апреля 2011

Нам пришлось использовать перенаправление привязки, чтобы заставить работать Autofac + NServiceBus.Я считаю, что файл NServiceBus.ObjectBuilder.Autofac2.dll, на который мы ссылались, использовал более старую версию Autofac, чем мы использовали.

app.config: ...

  <runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="Autofac" publicKeyToken="17863af14b0044da" />
    <bindingRedirect oldVersion="2.3.2.632" newVersion="2.4.3.700" />
  </dependentAssembly>
</assemblyBinding>

...