Thursday, June 16, 2005

Strong Names and PublicKeyTokens

[This was originally posted at]

Every now and then I see config files containing lines like:

<add assembly="System.Data,  Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>

When I first came to .Net I tried to avoid this, but it actually serves a useful purpose: specifying your assemblies in the config ensures that your app is using the correct version of an assembly. Many developers I've known don't want to deal with details like that, so I'm going to blog about some things that I've found to make it easier.
Where does this info come from?
This is the assembly's FullName. You could view it with the following code:

public string GetFullName(string strAssemblyPath) {
    Assembly a = Assembly.LoadFrom(strAssemblyPath));
    return a.FullName;
It has the following parts:
  • Assembly Name
  • Version
  • Culture
  • PublicKeyToken (generated from a strong-name)
This link on MSDN provides more info about Assembly names.
How can I tell the version and PublicKeyToken of an assembly?
You can tell both via the Assembly.FullName property as mentioned above. But you can also use other tools.
  • Assembly - right click on the assembly in Windows Explorer, and look at the "Version" tab.

  • PublicKeyToken  - use the Strong Name tool (sn.exe), run "sn -T C:\Temp\Common.dll" with the BIG 'T' (not little 't', which gives the token for the inline file instead).
My app doesn't need to worry about this. How can I simplify my life?
If you remove a section from the config file, then it won't filter on that. For example, if you don't care about the strong name, then you can simply remove it and use this instead:
<add assembly="System.Data,  Version=1.0.2411.0, Culture=neutral/></assemblies>
However, this could get you in trouble if multiple assemblies with different strong names are used later on.
I'll discuss some practical application of these concepts in a future post.

No comments:

Post a Comment