As a continuation of my last post, I thought some of you .net developers may be interested in hearing about some of the issues I ran into when strong naming.
Admittedly, this is my first real attempt at using strong naming as it’s intended and therefore I just wasn’t aware of a few things when I was writing the code for Chef. Two days ago I created myself a strong name key (sn -k keyfile.snk) to sign my assemblies with. Due to the obfuscation step I need to do between compile and packaging, I need to delay sign the assemblies.
In an exercise in curiosity I decided to sign the assemblies with the public key half of my keypair and keep the private key “secret”. Which really means just not kept inline with the sourcecode, but rather living in a key container in the machine store on the build box. This process was mostly problem-free, I used the sn.exe utility to: create a keypair; import the keypair into a key container; extract a public key from the key container; tell .NET to allow me to run partially signed assemblies with that public key token (sn -Vr *,) for debugging purposes. It all went well until I went into visual studio and told it to use the public key for signing – it kept telling me that it was password protected and prompting me for the password. I never put a password on it.
So to get around that, I did the first step (creating the keypair) from Visual Studio and gave it a password, then it all worked just fine.
One feature in Chef is the ability to create bookmarks. In my ignorance, I was simply using the BinaryFormatter in .NET and serializing to disk an array of these things for loading later. Little did I realize that all of the version information for the objects is written out – and if the objects live in a strong named assembly and the assembly version changes, it cannot deserialize! There’s supposed to be a way you can get around this, by setting AssemblyFormat on the formatter to Simple but it continued to write the version information. I also tried the route of using a custom Binder during deserialization and that didn’t work either.
As a result, last night I rewrote that code to serialize/deserialize the information myself with XmlWriter and XPathDocument rather than rely on .NET. Version issues gone. That’ll definitely be something I’m not likely to forget anytime soon. I need to rewrite one other small area this weekend for a similar problem, then I can move on. All that’s standing between me and Beta 2 is some thorough testing, a website update, and a file upload. Should all happen this weekend.