CSharpCodeProvider 'cannot find metadata file' Compiling Plugin Code With Mono
- by Jason Champion
I have some code in an XML file that I load and compile at runtime in an application.
This works fine on Windows, but under Mono I get assembly reference errors. Here's the examine code in question:
public static bool CompileSpell(Spell spell)
{
CSharpCodeProvider prov = new CSharpCodeProvider();
CompilerParameters cp = new CompilerParameters();
cp.GenerateExecutable = true;
cp.GenerateInMemory = true;
cp.ReferencedAssemblies.Add("system.dll");
cp.ReferencedAssemblies.Add("system.xml.dll");
cp.ReferencedAssemblies.Add("BasternaeMud.dll");
cp.ReferencedAssemblies.Add("ZoneData.dll");
Log.Trace("Compiling spell '" + spell.Name + "'.");
StringBuilder sb = new StringBuilder();
int idx = spell.FileName.IndexOf('.');
string file = spell.FileName;
if (idx > 0)
{
file = spell.FileName.Substring(0, idx);
}
int lines = GenerateWithMain(sb, spell.Code, "BasternaeMud");
CompilerResults cr = prov.CompileAssemblyFromSource(cp,sb.ToString());
....
The specific errors I get in the compiler results are:
cannot find metadata file 'system.dll' at line 0 column 0.
cannot find metadata file 'system.xml.dll' at line 0 column 0.
Mono obviously doesn't like the way I add referenced assemblies to the code I'm compiling for system.xml and system.xml.dll. The other two assemblies add fine, which is no surprise because they're the code that the compiler is actually executing from and exist in the executable directory.
Any clue what I need to do to fix this?
Maybe I could just drop those DLLs in the executable directory, but that feels like a dumb idea.