2011-04-02 11 views
2

的Mono.CSharp解释我的印象是Mono的编译器是usable in Microsoft.NET如何使用Microsoft.NET

编辑:updated blog posting here,我原来错过了一些解释它(是符合Justin的答案)

我创建了一个简单的类来尝试使用它

[TestFixture] 
class Class1 
{ 
    [Test] 
    public void EXPR() 
    { 
     Evaluator.Run("using System;"); 

     int sum = (int)Evaluator.Evaluate("1+2"); 

    } 
} 

,并在Visual Studio 2010中的一个项目,它引用C:\ Program Files文件(x86)的\单-2.10.1 \ LIB \单声道\ 4.0 \单.CSharp.dll。

然而,当我尝试运行这个任务,我得到下面的异常,在Evaluator.Run调用抛出:

System.TypeInitializationException was unhandled by user code 
     Message=The type initializer for 'Mono.CSharp.Evaluator' threw an exception. 
     Source=Mono.CSharp 
     TypeName=Mono.CSharp.Evaluator 
     StackTrace: 
      at Mono.CSharp.Evaluator.Run(String statement) 
      at Experiments.Class1.EXPR() in W:\Experiments\Class1.cs:line 16 
     InnerException: System.TypeLoadException 
      Message=Method 'Mono.CSharp.Location.ToString()' is security transparent, but is a member of a security critical type. 
      Source=Mono.CSharp 
      TypeName=Mono.CSharp.Location.ToString() 
      StackTrace: 
       at Mono.CSharp.Evaluator..cctor() 
      InnerException: 

阿谷歌证实了另外一个人问这个问题,但没有答案。我试图开始阅读the microsoft article on security transparent code,但很快就感到困惑。有人能够建议一个快速的解决方法,让我使用这个?并且可能总结出安全含义(如果有的话)给我(在我的情况下 - 未来我希望将它打包为一个厚客户端应用程序,以供内部和最终用户使用)

回答

2

看起来这是一个bug in Mono

.NET 4放弃Code Access Security但保留了Security Transparent Code的概念。简而言之,执行诸如调用非托管代码之类的低级代码必须是“安全关键”。应用程序级别代码被标记为“透明”。 “透明”代码不能调用“安全关键”代码。

听起来像Mono.CSharp.Location.ToString()需要用[SecuritySafeCritical]属性标记,如果你想让Mono 2.10代码与.NET 4一起工作。也许更好的办法是标记所有的Mono。 CSharp为SecuritySafeCritical

http://msdn.microsoft.com/en-us/library/system.security.securitycriticalattribute.aspx

PS。抱歉有一个问题有多个答案。在我意识到2.11会起作用后,我对2.10的错误意味着什么变得更加好奇。我无法将这个答案与其他人结合起来。

+0

感谢您的非常全面的答案! – fostandy 2011-04-28 01:14:46

6

它自从4月起在.NET下工作了last year

小的一点,但我注意到你的表达式中缺少分号sum

int sum = (int)Evaluator.Evaluate("1+2;");

我只是在一瞬间具有单2.11(从GIT),他们已经改为使用编译器而不是静态版本的多实例的版本。所以,我的代码看起来有点不同:

using System; 
using Mono.CSharp; 

namespace REPLtest 
{ 
    class MainClass 
    { 
     public static void Main (string[] args) 
     { 
      var r = new Report (new ConsoleReportPrinter()); 
      var cmd = new CommandLineParser (r); 

      var settings = cmd.ParseArguments (args); 
      if (settings == null || r.Errors > 0) 
       Environment.Exit (1); 

      var evaluator = new Evaluator (settings, r); 

      evaluator.Run("using System;"); 

      int sum = (int) evaluator.Evaluate("1+2;"); 

      Console.WriteLine ("The sum of 1 + 2 is {0}", sum); 
     } 
    } 
} 

编辑:我想我应该确认我其实并成功执行这种基于.NET 4(在Windows XP上使用Visual C#速成2010)

再次编辑:如果您有Visual Studio,您可以download the latest version of Mono.CSharp并自行编译它。源代码中包含一个.sln(解决方案文件),因此您可以在不使用Mono的情况下在Windows上构建它。生成的程序集将运行上面的代码。 Miguel有一篇文章解释了新的Mono.CSharp here

FINAL编辑:我上传了编译的Mono.CSharp.dll程序集,我实际使用here。把它作为参考来编译上面的代码。

+0

大卫Ebbo的也发布了最新版本的NuGet: https://nuget.org/packages/Mono.CSharp – 2012-03-08 15:08:42

3

我决定我应该保持代码更喜欢这个问题,但我不希望覆盖我以前的答案:

下面的代码与Mono.CSharp的2.11版本(可here包括解决方案文件的工作原理用Visual Studio/.NET构建)。它在Windows XP上使用.NET 4进行了测试。目前我无法访问Mono 2.10。

[TestFixture] 
class Class1 
{ 
    private Evaluator evaluator; 

    public Class1() 
    { 
     var report = new Report(new ConsoleReportPrinter()); 
     evaluator = new Evaluator(new CompilerSettings(), report); 
    } 

    [Test] 
    public void EXPR() 
    { 
     evaluator.Run("using System;"); 

     int sum = (int)evaluator.Evaluate("1+2;"); 
    } 
} 

编辑:我上传,我实际使用here的Mono.CSharp.dll组装。把它作为参考来编译上面的代码。

相关问题