Как использовать интерпретатор Mono.CSharp в Microsoft.NET - PullRequest
2 голосов
/ 02 апреля 2011

У меня сложилось впечатление, что компилятор Mono можно использовать в Microsoft.NET

edit: обновленная запись в блоге здесь , которую я изначально пропустил, что объясняет некоторые из них (согласуется с ответами Джастина)

Я создал простой класс, чтобы попытаться использовать его

[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: 

Google подтверждает, что еще один человек задал этот вопрос, но не получил ответа.Я пытался начать читать статью о прозрачном коде безопасности , но очень быстро запутался.Может ли кто-нибудь предложить быстрый обходной путь, чтобы я мог использовать это?И, возможно, суммируйте последствия для безопасности, если таковые имеются, для меня (в контексте моей ситуации - в будущем я надеюсь упаковать его с толстым клиентским приложением, которое будет использоваться как внутри, так и конечными пользователями)

Ответы [ 3 ]

6 голосов
/ 23 апреля 2011

Работает под .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 (с использованием Visual C # Express 2010 на Windows XP)

ВНОВЬ РЕДАКТИРОВАТЬ: Если у вас есть Visual Studio, вы можете загрузить последнюю версию Mono.CSharp и скомпилировать ее самостоятельно. В исходный код включен файл .sln (файл решения), так что вы можете собрать его в Windows без Mono. Получившаяся сборка запустит приведенный выше код. У Мигеля есть пост, объясняющий новый Mono.CSharp здесь .

ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: Я загрузил скомпилированную сборку Mono.CSharp.dll, которую я фактически использовал здесь . Включите его в качестве ссылки для компиляции кода выше.

3 голосов
/ 24 апреля 2011

Похоже, что это ошибка в Mono .

.NET 4 заброшена Защита доступа к коду , но сохраняется концепция Безопасность Прозрачный код .В двух словах, низкоуровневый код, выполняющий такие вещи, как вызов неуправляемого кода, должен быть «критически важным для безопасности».Код уровня приложения помечен как «прозрачный».«Прозрачный» код не может вызывать «критический для безопасности» код.

Похоже, что 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.Я не могу совместить этот ответ с остальными.

3 голосов
/ 23 апреля 2011

Я решил, что должен был сохранить код больше как вопрос, но я не хотел переписывать свой предыдущий ответ:

Код ниже работает с версией 2.11 Mono.CSharp (доступно здесь включая файл решения для сборки с помощью Visual Studio / .NET).Он был протестирован с .NET 4 на Windows XP.В данный момент у меня нет доступа к 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, которую я использовал здесь Включите его в качестве ссылки для компиляции кода выше.

...