views:

121

answers:

1

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.

+2  A: 

I don't know if you are running on Linux or not, but you might want to try properly capitalizing the dll names, as Linux is case-sensitive:

System.dll System.Xml.dll

jpobst
Perfect! I don't know why I would have thought those assemblies weren't case-sensitive, but that did the trick. Thank you.
Jason Champion