Getting Started
Architecture
Transports
Persistence
ServiceInsight
ServicePulse
ServiceControl
Monitoring
Samples

Assembly scanning

Component: NServiceBus
NuGet Package: NServiceBus (9.x)

NServiceBus scans assemblies at endpoint startup to automatically detect and load message types, message handlers, features, and installers.

There are some cases where finer control over which assemblies are loaded is required:

  • To limit the number of assemblies being scanned and hence improve startup time.
  • If hosting multiple endpoints out of the same directory, each endpoint may require loading a subset of assemblies.

AppDomain assemblies

By default, the assemblies already loaded into the AppDomain are scanned. The endpoint can also be configured to disable AppDomain assembly scanning:

var scanner = endpointConfiguration.AssemblyScanner();
scanner.ScanAppDomainAssemblies = false;

Assembly files

By default, all assemblies in the endpoint's bin directory are scanned for related interfaces so that the endpoint can configure them automatically.

Additional assembly scanning path

Assembly scanning can be configured to scan an additional path for assemblies outside the default scanning path.

var scanner = endpointConfiguration.AssemblyScanner();
scanner.AdditionalAssemblyScanningPath = additionalPathToScanAssemblies;

Nested directories

Nested directories are not scanned for assemblies by default. Nested directory assembly scanning can be enabled using:

var scanner = endpointConfiguration.AssemblyScanner();
scanner.ScanAssembliesInNestedDirectories = true;

Disable assembly files scanning

Scanning of assemblies deployed to the bin folder (and other configured scanning locations) can be disabled:

endpointConfiguration.AssemblyScanner().ScanFileSystemAssemblies = false;

Assemblies to scan

The assemblies being scanned can further be controlled via user-defined exclusions. This supports common scenarios removing specific assemblies from scanning without the risk of accidentally excluding required assemblies.

Exclude specific assemblies by name

var scanner = endpointConfiguration.AssemblyScanner();
scanner.ExcludeAssemblies("MyAssembly1.dll", "MyAssembly2.dll");

Exclude assemblies by wildcard

Multiple assemblies can be excluded by wildcards using the following approach:

var scanner = endpointConfiguration.AssemblyScanner();

var excludeRegexs = new List<string>
{
    @"App_Web_.*\.dll",
    @".*\.resources\.dll"
};

var baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
foreach (var fileName in Directory.EnumerateFiles(baseDirectory, "*.dll")
    .Select(Path.GetFileName))
{
    foreach (var pattern in excludeRegexs)
    {
        if (Regex.IsMatch(fileName, pattern, RegexOptions.IgnoreCase))
        {
            scanner.ExcludeAssemblies(fileName);
            break;
        }
    }
}

Exclude specific types

var scanner = endpointConfiguration.AssemblyScanner();
scanner.ExcludeTypes(type1, type2);

Suppress scanning exceptions

By default, exceptions that occurred during assembly scanning will be re-thrown. Those exceptions can be ignored using the following:

var scanner = endpointConfiguration.AssemblyScanner();
scanner.ThrowExceptions = false;