NServiceBus — сканирование всех сборок

NServiceBus.dll — версия 5.2.9 и NServiceBus.Host — версия 6.0.0

Я разрабатываю приложение рабочего процесса с подключаемыми надстройками.

В моем решении у меня есть хост-сборка NServiceBus, которую я размещаю с помощью NServiceBus.Host.exe. Чтобы предотвратить сканирование, я определил EndpointConfigurationType в NServiceBus.Host.exe.config.

<appSettings>
 <add key="EndpointConfigurationType" value="Libra.Workflow.Host.EndpointConfig, Libra.Workflow.Host" />
</appSettings>

Я проверил, что эта конфигурация используется, потому что, если я добавлю какой-то неизвестный тип, я получаю сообщение об ошибке, а также потому, что мой класс EndpointConfig создается до того, как произойдет какое-либо сканирование.

В методе Customize этого класса я добавил

public void Customize(BusConfiguration cfg)
{
  cfg.AssembliesToScan(AllAssemblies.Matching("Libra.Workflow.Messages.dll"));
  ...
}

Теперь, когда я запускаю этот проект, я получаю сообщение об ошибке, потому что NServiceBus сканирует все сборки, а по природе System.AddIn некоторые сборки не могут быть просканированы!

Это сканирование происходит сразу после создания экземпляра Libra.Workflow.Host, но до вызова метода Customize. Вот стек вызовов для этого сканирования:

at NServiceBus.Hosting.Helpers.AssemblyScanner.ScanAssembly(String assemblyPath, AssemblyScannerResults results) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Hosting\Helpers\AssemblyScanner.cs:line 153
at NServiceBus.Hosting.Helpers.AssemblyScanner.GetScannableAssemblies() in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Hosting\Helpers\AssemblyScanner.cs:line 63
at NServiceBus.GenericHost..ctor(IConfigureThisEndpoint specifier, String[] args, List`1 defaultProfiles, String endpointName, IEnumerable`1 scannableAssembliesFullName) in c:\BuildAgent\work\a3de8759ee491634\src\NServiceBus.Hosting.Windows\GenericHost.cs:line 33
at NServiceBus.Hosting.Windows.WindowsHost..ctor(Type endpointType, String[] args, String endpointName, IEnumerable`1 scannableAssembliesFullName) in c:\BuildAgent\work\a3de8759ee491634\src\NServiceBus.Hosting.Windows\WindowsHost.cs:line 21
at NServiceBus.Hosting.Windows.HostServiceLocator.DoGetInstance(Type serviceType, String key) in c:\BuildAgent\work\a3de8759ee491634\src\NServiceBus.Hosting.Windows\HostServiceLocator.cs:line 31
at Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(Type serviceType, String key) in c:\Home\Chris\Projects\CommonServiceLocator\main\Microsoft.Practices.ServiceLocation\ServiceLocatorImplBase.cs:line 49

Сообщение об ошибке, которое я получаю:

Could not enumerate all types for
'C:\msc\Trunk\Libra.Workflow\Build\Libra.Workflow.Host\AddIns\Libra.Workflow\Libra.Workflow.Processors.dll'

Почему NServiceBus сканирует эту DLL и как я могу это предотвратить?

Примечание. Поскольку это DLL-библиотека надстройки, на нее даже нет ссылки ни в Libra.Workflow.Host, ни в каких-либо других связанных сборках, поэтому у NServiceBus не должно быть абсолютно никаких причин касаться Это.


person Gunnar Valur Gunnarsson    schedule 08.03.2016    source источник
comment
Вам нужно добавить зависимости Libra.Workflow.Processors.dll к сканированию сборки?   -  person Sean Farmar    schedule 09.03.2016
comment
С надстройками дело в том, что некоторые из их зависимостей расположены в другом месте, а точнее в подпапках работающего хоста. Когда я создаю надстройку, я ссылаюсь на AddInView, но устанавливаю Copy Local = False, чтобы AddInView.dll не попадал в папку AddIn. Структура такая: .\AddIns\Libra.Workflow\Libra.Workflow.Processors.dll .\AddInViews\Libra.Workflow.Processors.Pipeline.AddInView.dll Эта вторая dll является зависимостью, которую сканер не может найти. Причина, по которой он не включен в надстройку, заключается в том, что все надстройки используют одну и ту же AddInView.dll.   -  person Gunnar Valur Gunnarsson    schedule 09.03.2016
comment
Однако я нашел временное обходное решение, но очень хотел бы остановить сканирование NServiceBus. Обходной путь заключается в добавлении дополнительной подпапки в проверку сборки в файле .config <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="AddInSideAdapters;AddInViews;Contracts;HostSideAdapters"/> </assemblyBinding> </runtime>   -  person Gunnar Valur Gunnarsson    schedule 09.03.2016
comment
Я запутался, вы говорите NServiceBus сканировать AssembliesToScan(AllAssemblies.Matching("Libra.Workflow.Messages.dll"));, но вы говорите, что не хотите, чтобы он сканировал ??   -  person Sean Farmar    schedule 09.03.2016


Ответы (1)


Одним из способов ограничения сканирования сборок, выполняемого NServiceBus.Host, является использование параметра /scannedAssemblies. Одно предостережение — явно передавать сборки NServiceBus.Core и NServiceBus.Host:

NServiceBus.Host.exe /scannedAssemblies:"NServiceBus.Core, Version=5.0.0.0, Culture=neutral, PublicKeyToken=9fc386479f8a226c" /scannedAssemblies:"NServiceBus.Host, Version=6.0.0.0, Culture=neutral, PublicKeyToken=9fc386479f8a226c"

Эта команда будет сканировать эти сборки NServiceBus и сборку, указанную в параметре приложения EndpointConfigurationType. Если вы хотите указать дополнительные сборки (например, ваши Libra.Workflow.Messages), вы можете добавить дополнительный переключатель /scannedAssemblies.

Подробности см. на этой странице документации: line" rel="nofollow">http://docs.particular.net/nservicebus/hosting/nservicebus-host/#configuring-the-endpoint-controlling-assembly-scanning-using-the-command-line .

person Marcin Hoppe    schedule 10.03.2016
comment
Спасибо, именно то, что мне было нужно, это работает как в режиме .exe, так и в режиме NTService. Знаете ли вы, есть ли какие-либо основные сборки, которые я должен добавить, например NServiceBus.Core? - person Gunnar Valur Gunnarsson; 10.03.2016
comment
Вы также должны указать любую сборку расширения, которую вы используете. Например, если вы используете транспорт, отличный от MSMQ, вам также следует добавить транспортную сборку. Дополнительные сведения о сканировании сборок см. в этом документе: docs.particular.net/nservicebus/hosting/. - person Marcin Hoppe; 10.03.2016
comment
Еще раз спасибо. Именно то, что мне было нужно. - person Gunnar Valur Gunnarsson; 10.03.2016