Ah ha! Turns out the user context we were running under didn't have permissions to the c:\winnt\temp directory. Ouch. An easy fix, but not one that was intuitively obvious, at least to me. I knew that the XmlSerializer created dynamic assemblies, but I didn't know they had to be persisted to disk.