我在Ubuntu 11.10上运行Mono版本2.10。我正在尝试运行http://blog.davidebbo.com/2012/02/quick-fun-with-monos-csharp-compiler-as.html上提供的示例,但它似乎针对不同版本的mono。例如,Compile是Evaluator上的静态方法。我对他的样本进行了以下更改,但是没有使用它。任何人都可以提供正确的更改,并且有人知道有关Mono.CSharp的API更改的任何信息吗?我的编译器报告的版本如下:
$ dmcs --version
Mono C# compiler version 2.10.5.0
我使用以下命令行编译了以下代码:
dmcs -r:Mono.CSharp Sample.cs
编译时收到此警告。
dmcs -r:Mono.CSharp Sample.cs
Sample.cs(26,17): warning CS0219: The variable `compiledMethod' is assigned but its value is never used
Compilation succeeded - 1 warning(s)
这是运行代码的结果:
$ ./Sample.exe
{interactive}(2,40): error CS1525: Unexpected symbol `namespace', expecting `end-of-file' or `using'
{interactive}(4,70): error CS0101: The namespace `UserCode' already contains a definition for `Foo'
{interactive}(4,70): (Location of the symbol related to previous error)
这是我到目前为止的守则:
using System;
using System.IO;
using Mono.CSharp;
using System.Reflection;
namespace Sample
{
public interface IFoo { string Bar(string s); }
class Program
{
const string code = @"
using System;
namespace UserCode
{
public class Foo : Sample.IFoo
{
public string Bar(string s) { return s.ToUpper(); }
}
}
";
static void Main(string[] args)
{
Mono.CSharp.Evaluator.Init(new string[] {} );
Evaluator.ReferenceAssembly(Assembly.GetExecutingAssembly());
var compiledMethod = Evaluator.Compile(code);
for (;;)
{
string line = Console.ReadLine();
if (line == null) break;
object result;
bool result_set;
Evaluator.Evaluate(line, out result, out result_set);
if (result_set) Console.WriteLine(result);
}
}
}
}
答案 0 :(得分:3)
Mono 2.10附带了Evaluator,仅支持表达式和语句。您的代码包含Mono 2.10不支持的类型声明。
Mono 2.11或git master Mono.CSharp支持类型声明和其他高级功能。
答案 1 :(得分:1)
根据这个:http://www.mono-project.com/Release_Notes_Mono_2.12#Instance_API,静态/全局Evaluator是较旧的API,而Instance API是较新的。我拥有的Mono是当前的稳定版本(2.10),版本2.11附带的Mono.CSharp具有实例方法。 2.12看起来还没有发布。
此处再次提到编译器作为服务的实例API:http://tirania.org/blog/archive/2011/Oct-14.html