繁体   English   中英

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

[英]How do I use the Mono.CSharp interpreter in Microsoft.NET

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

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

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

[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的项目。

但是,当我尝试运行此任务时,我在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: 

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

去年 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,可以下载最新版本的Mono.CSharp自行编译。 源中包含.sln(解决方案文件),因此您可以在没有Mono的Windows上构建它。 生成的程序集将运行上面的代码。 Miguel 在这里有一篇解释新Mono.CSharp的帖子。

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

我决定我应该让代码更像问题,但我不想覆盖我以前的答案:

下面的代码适用于Mono.CSharp的2.11版本( 此处包含用于使用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;");
    }
}

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

看起来这是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的错误意味着什么变得更加好奇。 我无法将这个答案与其他答案结合起来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM