Я бы хотел использовать компилятор Mono в качестве службы из моего обычного приложения .NET 3.5.
Я скачал последние версии (2.6.7), создал простое консольное приложение в Visual Studio иссылается на Mono.CSharp dll.
Затем в моем консольном приложении (прямо из примера в сети):
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 равен нулю ... поэтому я не уверен, что происходитнеправильно.Никаких исключений не выдается ...
Итак, я хотел бы выяснить, почему 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).Кто-нибудь имеет представление о том, насколько это будет трудно, или кто-нибудь может указать мне правильное направление здесь?
Спасибо.