CSharpCodeProvider 'не может найти файл метаданных' Компиляция кода плагина с моно - PullRequest
1 голос
/ 24 марта 2010

У меня есть некоторый код в файле XML, который я загружаю и компилирую во время выполнения в приложении.

Это нормально работает в Windows, но в Mono я получаю ошибки ссылок на сборки. Вот проверочный код, о котором идет речь:

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());
            ....

Конкретные ошибки, которые я получаю в результатах компиляции:

cannot find metadata file 'system.dll' at line 0 column 0.
cannot find metadata file 'system.xml.dll' at line 0 column 0.

Очевидно, что Mono не нравится способ добавления ссылочных сборок в код, который я компилирую для system.xml и system.xml.dll. Две другие сборки добавляются нормально, что неудивительно, поскольку они представляют собой код, из которого фактически выполняется компилятор, и существуют в каталоге исполняемых файлов.

Любая подсказка, что мне нужно сделать, чтобы это исправить?

Возможно, я мог бы просто отбросить эти DLL в исполняемый каталог, но это похоже на глупую идею.

1 Ответ

4 голосов
/ 24 марта 2010

Я не знаю, работаете ли вы в Linux или нет, но вы можете попытаться правильно использовать заглавные буквы в dll, поскольку в Linux учитывается регистр:

System.dll
System.Xml.dll
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...