Моно-компилятор как услуга (MCS)
Я бы хотел использовать компилятор Mono как сервис из моего обычного приложения .NET 3.5.
Я скачал последние версии (2.6.7), создал простое консольное приложение в Visual Studio и ссылался на dll Mono.CSharp.
Затем в моем консольном приложении (прямо из примера онлайн):
Evaluator.Run("using System; using System.Linq;");
bool ress;
object res;
Evaluator.Evaluate(
"from x in System.IO.Directory.GetFiles (\"C:\\\") select x;",
out res, out ress);
foreach (var v in (IEnumerable)res)
{
Console.Write(v);
Console.Write(' ');
}
Это вызывает исключение в Evaluator.Run (первая строка):
Illegal enum value: 2049.
Parameter name: access
Это потому, что DLL был скомпилирован с использованием Mono.exe, а не csc.exe, я считаю.
Я пытался скачать dll Mono.CSharp прямо сhttp://tirania.org/blog/archive/2010/Apr-27.html в файле demo-repl.zip ... и это не вызывает исключения ... Однако параметр out (res) после вызова Evaluator.Evaluate имеет значение null ... поэтому я не уверен, что происходит не так. Не исключение брошено ...
Итак, я хотел бы выяснить, почему DLL, которую я скачал с demo-repl.zip, возвращает ноль.
РЕДАКТИРОВАТЬ: я понял, почему он возвращает ноль. Кажется, по какой-то причине компилятор не захватывает пространство имен System.Linq ... хотя я не могу сказать, почему ... Если я просто оцениваю "System.IO.Directory.GetFiles (\" C: \\ ")", работает нормально.
ОБНОВЛЕНИЕ: Определенно кажется, что что-то не так с компилятором Mono, собирающим ссылки на системные сборки. Если я напрямую скопирую образец их инструмента консоли csharp:
csharp> var list = new int [] {1,2,3};
csharp> var b = from x in list
> where x > 1
> select x;
csharp> b;
Я получаю исключение:
{interactive}(1,25): error CS1935: An implementation of `Select' query expressio
n pattern could not be found. Are you missing `System.Linq' using directive or `
System.Core.dll' assembly reference?
Кроме того, для того чтобы MCS действительно было выполнимым решением, мне нужно изменить компилятор так, чтобы он генерировал одну динамическую сборку, а не одну сборку на вызов вычисления (в противном случае это приводит к значительной утечке памяти, которая Я имел дело с ранее в виде CSharpCodeProvider). Кто-нибудь имеет представление о том, насколько это будет сложно, или кто-то может указать мне правильное направление здесь?
Благодарю.