Monday, June 03, 2013

Getting Public Key Token of Assembly Within Visual Studio

This is a very common Assembly.Load failure exception text. The terminology, this is called Ref-Def-Mismatch. This exception is thrown when your project finds an assembly that does not match what you
are looking for. A very common mismatch is version number. An example is, you asks for version, but version is found. (keep in mind that for simply named assemblies, version
number is ignored. So we are really talking about strongly named assemblies here.)

The only time this exception will be thrown is when the mismatched assembly is in your appbase. Visual Studio will probe GAC first. If the assembly is not found in GAC, then it will probe your
appbase. If an assembly is found that matches the simple name, but has mismatch on other part of the assembly name, this exception will be thrown. Say you call
Assembly.Load(”MyAsm,Version=,Culture=Neutral,PublicKeyToken=0123456789abcdef”, and VisualStudio finds MyAsm.dll in your appbase, but its version is, an exception will be thrown at
compilation time.

Regarding binding design decision.

Another interesting observation on this is for dependencies of LoadFrom assemblies. For dependencies of LoadFrom assemblies, we will probe the appbase, then the parent assembly's directory. If a
mismatch assembly is found in appbase, it does not mean a matching assembly won't be found in parent assembly's directory.

To solve this you can force specific version using Strongly named assembly. You must sign the assembly during the build step then reference your project with an assembly already build
in the target folder and then you can edit the project and force a specific assembly version using the PublicKeyToken attribute.

To generate the PublicKeyToken
In Visual Studio, go to the Tools menu and choose External Tools.

That brings up a new dialog window.

Click the Add button and add the following:

Title: Get &PublicKeyToken

Command: C:\Program Files\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe

Arguments: -Tp $(TargetPath)

Check the Use Output Window checkbox. The final looks like this:

Create a project and sign it using a strong name key. Then choose Tools / Get PublicKeyToken, and in the output window you will see something like the following:

Microsoft (R) .NET Framework Strong Name Utility Version 3.5.21022.8
Copyright (c) Microsoft Corporation. All rights reserved.

Public key is


Public key token is 9589fa1be527eb6c

You can use the Public Key to force the dependency with a specific assembly.
This is useful for design time assembly or to differentiate assembly limited
in feature with full featured assembly

No comments: