This was brought to my attention by Shay Friedman, who was trying to use IronPython.Zlib but couldn’t get it to work. In particular, the error message was misleading:
IronPython 2.6.1 (2.6.10920.0) on .NET 4.0.30319.1 Type "help", "copyright", "credits" or "license" for more information. >>> import clr >>> clr.AddReferenceToFileAndPath('C:\Users\Jeff\Downloads\IronPython.Zlib-2.6-clr4\IronPython.Zlib.dll') Traceback (most recent call last): File "The file, of course, does exist, so why can’t IronPython find it?
", line 1, in IOError: System.IO.IOException: file does not exist: C:\Users\Jeff\Downloads\IronPython.Zlib-2.6-clr4\IronPython.Zlib.dll at Microsoft.Scripting.Actions.Calls.MethodCandidate.Caller.Call(Object args, Boolean& shouldOptimize) ... >>>
There are actually a few things that interplay here: first, it must be downloaded with a browser that taints the file (which I believe are just IE and Chrome), and second, it must be unzipped with Windows’ built in unzipping tools. The built in tools have the interesting property that when unzipping a tainted zip file will also taint all of the unzipped files. Finally, the punchline: .NET will not load an assembly that is tainted.
So how do we get around this? Well, you can:
- use a different browser
- use a different unzipping tool (I highly recommend 7-zip)
- unblock the zip file prior to unzipping
If you’ve already unzipped the file, you can just unblock the DLL. Depending on where you unzipped the file to, you my need to use an elevated Explorer window. You can also unblock multiple files from the command line.
This may well affect applications other than IronPython, so it’s just one more thing to watch for.