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

C# 如何在Microsoft.NET中使用Mono.CSharp解释器,c#,compiler-construction,mono,C#,Compiler Construction,Mono,我觉得Mono的编译器 编辑:我最初错过了,这解释了其中的一些原因(与Justin的答案一致) 我创建了一个简单的类来尝试使用它 [TestFixture] class Class1 { [Test] public void EXPR() { Evaluator.Run("using System;"); int sum = (int)Evaluator.Evaluate("1+2"); } } 以及Visual Studio

我觉得Mono的编译器

编辑:我最初错过了,这解释了其中的一些原因(与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)\Mono-2.10.1\lib\Mono\4.0\Mono.CSharp.dll的项目

但是,当我尝试运行此任务时,会在计算器上引发以下异常。运行调用:

    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: 

谷歌证实了另一个人问这个问题,但没有回答。我试图开始阅读,但很快就被弄糊涂了。有人能建议一个快速的解决方法让我使用这个吗?并可能向我总结安全方面的影响(如果有的话)(在我的情况下-将来我希望用一个厚客户端应用程序包它,供内部和最终用户使用)

它自年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);
        }
    }
}
编辑:我想我应该确认我确实在.NET 4上成功地执行了此操作(在Windows XP上使用Visual C#Express 2010)

再次编辑:如果您有Visual Studio,您可以自己编辑它。源代码中包含一个.sln(解决方案文件),因此您可以在Windows上构建它,而无需Mono。生成的程序集将运行上面的代码。米格尔有一篇文章解释了新的Mono.CSharp


最终编辑:我上传了我实际使用的编译后的Mono.CSharp.dll程序集。将其作为编译上述代码的参考。

我决定保留与问题类似的代码,但我不想覆盖我以前的答案:

下面的代码适用于Mono.CSharp的2.11版(包括用于使用Visual Studio/.NET构建的解决方案文件)。它是在WindowsXP上用.NET4测试的。我目前没有访问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;");
    }
}
编辑:我上传了我实际使用的Mono.CSharp.dll程序集。将其作为编译上述代码的参考。

看起来这是一个错误

.NET4放弃了但保留了的概念。简而言之,底层代码(如调用非托管代码)必须是“安全关键的”。应用程序级代码标记为“透明”。“透明”代码不能调用“安全关键”代码

如果您希望Mono 2.10代码与.NET 4一起使用,那么听起来像Mono.CSharp.Location.ToString()需要用[SecuritySafeCritical]属性进行标记。也许更好的办法是将所有Mono.CSharp标记为


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

David Ebbo还向NuGet发布了最新版本: