2011-05-02 61 views
4

我想在MS .NET框架中使用来自Mono项目的C#-Evaluator。简单的表达式编译运行正常。例如:为什么我不能用Mono的Evaluator编译LINQ语句?

 var report = new Report(new Printer()); 
     var settings = new CommandLineParser(report).ParseArguments(new string[] { }); 
     var eval = new Evaluator(settings, report); 

     // ensure that the LINQ to object assembly is referenced 
     eval.ReferenceAssembly(typeof(Enumerable).Assembly); 

     eval.Run("using System;"); 
     eval.Run("using System.Collections.Generic;"); 
     eval.Run("using System.Linq;"); 

     // Runs just fine: 
     eval.Run("IEnumerable<string> allData = new string[0];"); 
     eval.Run("Console.Out.WriteLine(allData.Count());"); 

只要我引入任何LINQ语句,就会得到异常。例如:

 // Crashes: 
     eval.Run("IEnumerable<string> allData = new string[0];"); 
     eval.Run("var filtered = from d in allData select d;"); 
     eval.Run("Console.Out.WriteLine(filtered.Count());"); 

的错误是:

Internal compiler error at Internal(1,1):: exception caught while emitting Name: Host 
Attributes: 150 
Method Signature: Length: 5 
Arguments: 0 
Signature: 
0 0 1 16 28 0 

Mono.CSharp.InternalErrorException : VariableInfo is null and the variable `filtered' is not used 
at Mono.CSharp.LocalVariable.CreateBuilder(EmitContext ec) in statement.cs: line 1593 
at Mono.CSharp.BlockVariableDeclaration.DoEmit(EmitContext ec) in statement.cs: line 1368 
at Mono.CSharp.Statement.Emit(EmitContext ec) in statement.cs: line 69 
at Mono.CSharp.Block.DoEmit(EmitContext ec) in statement.cs: line 2035 
at Mono.CSharp.Block.Emit(EmitContext ec) in statement.cs: line 2045 
at Mono.CSharp.ExplicitBlock.Emit(EmitContext ec) in statement.cs: line 2177 
at Mono.CSharp.ToplevelBlock.Emit(EmitContext ec) in statement.cs: line 2918 
at Mono.CSharp.MethodData.Emit(DeclSpace parent) in method.cs: line 2021 
at Mono.CSharp.MethodOrOperator.Emit() in method.cs: line 686 
at Mono.CSharp.Method.Emit() in method.cs: line 1232 
at Mono.CSharp.TypeContainer.EmitType() in class.cs: line 1968 
at Mono.CSharp.Evaluator.CompileBlock(Class host, Undo undo, Report Report) in eval.cs: line 659 
at Mono.CSharp.Evaluator.Compile(String input, ref CompiledMethod compiled) in eval.cs: line 231 
at Mono.CSharp.Evaluator.Evaluate(String input, ref Object result, ref Boolean result_set) in eval.cs: line 298 
at Mono.CSharp.Evaluator.Run(String statement) in eval.cs: line 391 

我做得显然是错误的?还是Mono评估员显然不准备使用?

+2

您是否尝试用实际类型替换'var',即'IEnumerable '? – 2011-05-02 15:47:12

+0

InternalErrorException不是一件好事。你没有做错什么。如果您仍然遇到此问题,请使用新的Mono进行测试,然后在bugzilla上提交错误。谢谢! – 2011-05-02 16:00:05

+0

现在我已经尝试过了。修复异常并返回编译错误。 .NET框架和Mono程序集中的属性发生冲突。将检查。不管怎么说,还是要谢谢你。 – Gamlor 2011-05-02 16:02:50

回答

2

只是删除下面的代码行:

// ensure that the LINQ to object assembly is referenced 
eval.ReferenceAssembly(typeof(Enumerable).Assembly); 

,因为你引用它已经被using指令这是没有必要的。

相关问题