How to sign C++/CLI assemblies with a strong name

Introduction

If your application is signed with a strong name, Visual Studio will require you to sign every assembly you reference. Now, even if you are a .NET only developer, it happens sometimes that you have to deal with some kind of interop with C++/CLI DLLs. If both situations happen, you will find yourself in the need to sign a C++ assembly with a strong name.

To do so, you have to specify the key file you will use, at: Project-> Properties-> Configuration Properties-> Linker-> Advanced-> Key File. Something like this:

Don't try to sign the assembly with a .Pfx file. It won't work. To do so, you need a .SNK file (Strong Name Key). You can generate one with the SN.EXE tool, using:

sn.exe –k [directory]\[filename].snk

Where to find SN.EXE?

In the Microsoft .NET Framework SDK (usually c:\program files\microsoft .net\sdk\bin, or something similar). You can download the SDK from here.

Note: In order to install the SDK, you will also need the .NET Framework 1.1 installed. As it's a bit old, many people don't have it in their machines.

Share

About the Author

Inaki Ayucar is a Microsoft MVP in DirectX/XNA, and a software engineer involved in development since his first Spectrum 48k, in the year 1987. He is the founder and chief developer of The Simax Project (www.simaxvirt.com) and is very interested in DirectX/XNA, physics, game development, simulation, C++ and C#.

I added a non-existent snk file to the Link/Advanced/Key to insure the build process would complain. But I rebuilt with no errors. How can I be sure the assembly gets strongly named, nothing seems to happen.

I just wanted to mention that I think you can sign the assembly with a pfx file, but you need to first install the pfx file into a key container (use "sn.exe -i") and then specify that key container in the C++ project's "Key Container" property.

We are siging our assemblies using a PFX file and using ILMerge to merge the signed assemblies.

The merged assembly is delayed signed and needs signing, hence we have to use sn.exe.

However sn.exe asks for password each time. As we will end up with 100+ merged asseblies (its a big project). We want to automate this process using a batch file. However sn.exe does not accept a password parameter.