Obama congratulates you on your broken apps

Fixing an unhandled exception about StructureMap configuration failing (messed up assembly bindings)

This post was most recently updated on December 7th, 2022.

3 min read.

So, you’re running a console program, but while you try running it, you get an error like this: “StructureMap.Exceptions.StructureMapConfigurationException“, with a message like this: “Unable to find the exported Type’s in assembly” (the typo done by Microsoft, not me). There are a number of reasons for this error, but for a fair share of the time, that’s just your assembly bindings being messed up. Luckily, that’s another easy fix! 

Problem

When running the executable (probably an .exe), or after scheduling a task, or possibly after running an Azure webjob, you discover an error like this from the log files, or get it in your console, or log stream:

Unhandled Exception: 
StructureMap.Exceptions.StructureMapConfigurationException: StructureMap configuration failures:
Error: 170
Source: Registry: StructureMap.Configuration.DSL.Registry, StructureMap, Version=2.6.1.0, Culture=neutral, 
PublicKeyToken=e60ad81abae3c223
Unable to find the exported Type's in assembly ..., Version=..., Culture=neutral, 
PublicKeyToken=null. One or more of the assembly's dependencies may be missing.

It’s also possible to get errors in your task scheduler, something like this:

Scheduled Task failed with error code 0xE0434352

0xE0434352” apparently refers to unknown software errors – so that’s not useful :) However, this error might be a symptom of incorrect assembly rebinding configuration. This configuration is typically done in the .config -file accompanying the executable – so probably in a file named something like <yourexecutable>.exe.config.

Solution: remove incorrect bindings

Take a backup of the file first, then open it, browse to <runtime> -section, and remove the whole <assemblyBinding xmlns=”urn:schemas-microsoft-com:asm.v1″> -node and everything inside it.

So instead of looking like a bloated mess like this:

NuGet Package Manager has messed up the bindings of the project - just look at this nonsense in the app.config -file!
NuGet Package Manager has messed up the bindings of the project – just look at this nonsense in the app.config -file!

It should look lean and beautiful like this:

App.config after cleaning up the nonsense added by NuGet Package Manager! Just one assemblybinding was actually required.
App.config after cleaning up the nonsense added by NuGet Package Manager! Just one assembly binding was actually required.

And the same examples in the text – the messed up version:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.WindowsAzure.Storage" publicKeyToken="31BF3856AD364E35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-8.1.1.0" newVersion="8.1.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Data.Services.Client" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.8.3.0" newVersion="5.8.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Data.Edm" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.8.3.0" newVersion="5.8.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Data.OData" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.8.3.0" newVersion="5.8.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.IdentityModel" publicKeyToken="b77a5c561934e089" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Configuration" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.ServiceModel" publicKeyToken="b77a5c561934e089" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Xml" publicKeyToken="b77a5c561934e089" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System" publicKeyToken="b77a5c561934e089" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.WindowsAzure.Storage" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-8.7.0.0" newVersion="8.7.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.IdentityModel.Clients.ActiveDirectory" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.29.0.1078" newVersion="2.29.0.1078" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Graph.Core" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.7.0.0" newVersion="1.7.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Graph" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.7.0.0" newVersion="1.7.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Azure.KeyVault.Core" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

And the cleaned-up version of the file:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.IdentityModel.Clients.ActiveDirectory" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.29.0.1078" newVersion="2.29.0.1078" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

In this example, the bindings for Microsoft.IdentityModel.Clients.ActiveDirectory was actually needed, and everything else was nonsense. See more about this particular assembly here:

Then try running the executable again.

Please note: Even though NuGet package updates make your assembly binding configuration into a whole mess, as they add these bindings automatically, and there’s a good chance they are not actually required, you MIGHT also have them for a reason :) In that case, you’ll be getting another error after clearing the bindings from configuration. Only this time the error will be about an incorrect assembly version – that’s usually at least a bit useful! In this case, you can just restore the bindings for that particular assembly from the backup you took earlier.

mm
5 1 vote
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments