Signing a DLL (Strong Name)

1 minute read

I was working on a project in C# and I had to sign an assembly with a Strong Name.

Here’s how I did that:

  • Go to the project’s properties
  • Go to the tab Signing
  • Check Sign the assembly
  • Choose <New...> from the drop-down list
  • Give it a name (I used my solution’s name) and uncheck Protect my key file with a password

The assembly was signed now. However, when I tried to build it, an error occurred:

Assembly generation failed -- Referenced assembly 'Assembly' does not have a strong name

So the DLL had to be signed, too. Luckily, I had the source of the DLL. It’s also possible to sign a DLL without the source, but this won’t always work.

Sign the DLL using the source

  • Open the project in Visual Studio
  • Follow the steps to sign an assembly above for the DLL (but now use the key you already created by clicking <Browse...> instead of <New...>)
  • Build the DLL

If you get the following error:

Friend assembly reference 'Assembly.Tests' is invalid. Strong-name signed assemblies must specify a public key in their InternalsVisibleTo declarations.

Replace the following values in the commands:

Placeholder Value
{SNK} The path to the combined key (.snk)
{PUB} The path to public key (will be created)
{KEY} The public key in SHA1 format
  • Double click the error
  • Start Visual Studio’s Developer Command Prompt
  • Issue the following commands:
    sn -p "{SNK}" "{PUB}"
    sn -tp "{PUB}"
    
  • This will display the public key, copy the public key under Public key (hash algorithm: sha1) Don’t copy the public key token!
  • Go back to your project
  • Locate the following line:
    [assembly: InternalsVisibleTo("Assembly.Tests")]
    
  • Put the public key in the string:
    [assembly: InternalsVisibleTo("Assembly.Tests, PublicKey={KEY}")]
    
  • Build the DLL

Sign the DLL without the source

Replace the following values in the commands:

Placeholder Value
{DLL} The path to the original DLL
{IL} The path to .il file (will be created)
{RES} The path to the .res file (located in the same folder as the .il file)
{KEY} The path to the .snk file (the key file)
{DLL2} The path to the signed DLL (will be created)
  • Start Visual Studio’s Developer Command Prompt
  • Run the following commands:
    ildasm "{DLL}" /out:"{IL}"
    ilasm "{IL}" /res:"{RES}" /dll /key:"{KEY}" /out:"{DLL2}"
    

The DLL has now been signed with your key. Just re-add the reference to the new, signed DLL in your project and rebuild.

Updated:

Leave a comment