我想使用 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 编译的。
我已经尝试直接从http://tirania.org/blog/archive/2010/Apr-27.html在 demo-repl.zip 文件中下载 Mono.CSharp dll ......这不会引发异常。 ..但是调用 Evaluator.Evaluate 后的 out 参数(res)为空......所以我不确定出了什么问题。没有抛出异常...
所以,我想弄清楚为什么我从 demo-repl.zip 下载的 dll 返回 null。
编辑:我弄清楚为什么它返回null。似乎由于某种原因,编译器没有选择 System.Linq 命名空间......虽然我不知道为什么......如果我只是 Evaluate "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 的形式处理过)。有没有人知道这会有多困难,或者有人可以在这里指出我正确的方向吗?
谢谢。