如何在Microsoft.NET中使用Mono.CSharp解释器

fos*_*ndy 2 c# compiler-construction mono

我的印象是Mono的编译器可以在Microsoft.NET中使用

编辑:更新的博客发布在这里,我最初错过了解释其中一些(与贾斯汀的答案一致)

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

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)

Visual Studio 2010中引用C:\ Program Files(x86)\ Mono-2.10.1\lib\mono\4.0\Mono.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: 
Run Code Online (Sandbox Code Playgroud)

谷歌确认另一个人问这个问题,但没有回答.我试图开始阅读有关安全透明代码的微软文章,但很快就感到困惑.有人能够建议一个快速的解决方法,让我使用它吗?并且可能总结一下安全隐患(如果有的话)(在我的情况下 - 将来我希望用厚客户端应用程序打包它,以便在内部和最终用户使用)

Jus*_*tin 6

去年 4月以来,它一直在.NET下工作.

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

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

我目前只有Mono 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:我想我应该确认我确实在.NET 4上成功执行了此操作(在Windows XP上使用Visual C#Express 2010)

再次编辑:如果您有Visual Studio,可以下载最新版本的Mono.CSharp自行编译.源中包含.sln(解决方案文件),因此您可以在没有Mono的Windows上构建它.生成的程序集将运行上面的代码.Miguel 在这里有一篇解释新Mono.CSharp的帖子.

最后编辑:我上传,我实际使用的编译Mono.CSharp.dll装配在这里.将其作为编译上述代码的参考.