簡體   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