2012-04-25 7 views
1

Я запускаю Mono версию 2.10 на Ubuntu 11.10. Я пытаюсь запустить образец, предоставленный на http://blog.davidebbo.com/2012/02/quick-fun-with-monos-csharp-compiler-as.html, но, похоже, он нацелен на другую версию моно. Например, Compile является статическим методом в Evaluator. Я сделал следующие изменения в своем примере, но не получил его. Может ли кто-нибудь предоставить правильные изменения, и кто-нибудь знает, есть ли какая-либо информация об изменениях API в Mono.CSharp? Версия сообщает мой компилятор выглядит следующим образом:Mono.CSharp (компилятор как услуга) изменяется в версии 2.10

$ dmcs --version 
Mono C# compiler version 2.10.5.0 

Я составил следующий код, используя эту командную строку:

РСЧА -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

Согласно [this] (http://permalink.gmane.org/gmane.comp.gnome.mono.patches/178509), старый Evaluator был статичным, и новый Evaluator является членом. Мне нужно проверить мою версию dll. – kristianp

ответ

1

В соответствии с этим: http://www.mono-project.com/Release_Notes_Mono_2.12#Instance_API, статический/глобальный Evaluator это более старый API, а API-интерфейс экземпляра - более новый. Моно у меня есть текущая стабильная версия (2.10), а Mono.CSharp, которая поставляется с версией 2.11, имеет методы экземпляра. 2.12 пока не выпущен.

Вот еще упоминание экземпляра API для компилятора как сервис: http://tirania.org/blog/archive/2011/Oct-14.html

3

Mono 2,10 поставляется с поддержкой выражений оценщика и отчетности только. Ваш код содержит объявление типа, которое не поддерживается Mono 2.10.

Mono 2.11 или git master Mono.CSharp имеют поддержку деклараций типов и других расширенных функций.