Поддерживает ли mono 2.8 ключевое слово «dynamic»? - PullRequest
2 голосов
/ 13 октября 2010

Я тестировал IronPython на моно 2.8 с кодом в книге Профессиональный IronPython стр.315 ​​со списком 15-3.

using System;
using IronPython.Hosting;
using IronPython.Runtime;
using Microsoft.Scripting.Hosting;

namespace Method2
{
    class Program
    {
        static void Main(string[] args)
        {
            // Obtain the runtime.
            var IPY = Python.CreateRuntime();

            // Create a dynamic object containing the script.
            dynamic TestPy = IPY.UseFile("TestClass.py");

            // Execute the __test__() method.
            TestPy.__test__();
        }
    }
}

Я вижу, что он скомпилирован и работает безпроблема в Windows 7, тогда как mono 2.8 выдает мне следующее сообщение об ошибке:

Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 
`Microsoft.Scripting.Hosting.ScriptScope' does not contain a definition for `__test__'
at (wrapper dynamic-method) object.CallSite.Target (System.Runtime.CompilerServices.Closure,System.Runtime.CompilerServices.CallSite,object) 
at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid1
(System.Runtime.CompilerServices.CallSite,object) 
at Method2.Program.Main (string[]) 

Я думал, что Mono 2.8 поддерживает C # 4.0, который имеет ключевое слово dynamic, но я вижу, что ключевое слово dynamic не полностьюподдерживается с mono.

Это ошибка Mono 2.8?

ДОБАВЛЕНО

Это скрипт на python.

# The class you want to access externally.
class DoCalculations():

    # A method within the class that adds two numbers.
    def DoAdd(self, First, Second):

        # Provide a result.
        return First + Second

# A test suite in IronPython.
def __test__():

    # Create the object.
    MyCalc = DoCalculations()

    # Perform the test.
    print MyCalc.DoAdd(5, 10)

    # Pause after the test session.
    raw_input('\nPress any key to continue...')

Это командачто я использовал

dmcs Program.cs /r:System.Core /r:IronPython.dll /r:IronPython.Modules.dll /r:Microsoft.Dynamic.dll /r:Microsoft.Scripting.dll /r:Microsoft.CSharp.dll

Он хорошо компилируется, но все равно ломается, когда я запускаю исполняемый бинарный файл.Нужно ли иметь все библиотеки в одном каталоге, где находится исполняемый файл?

Ответы [ 3 ]

3 голосов
/ 08 марта 2011

Тот факт, что вы получаете Microsoft.CSharp.RuntimeBinder.RuntimeBinderException, означает, что динамическое ключевое слово сработало. Проблема в том, что IPY.UseFile ("TestClass.py"); возвращает ScriptScope, который не видит ваш метод test . Таким образом, проблема связана с вашим исходным кодом на Python или с тем, как вы включаете IronPython с моно.

1 голос
/ 13 мая 2012

Я отвечаю на этот вопрос относительно Mono 2.10.

Я мог бы успешно собрать и выполнить код из командной строки в Windows 7 без использования MonoDevelop. Вот шаги:

  1. Установка Mono 2.10.8 в Windows 7.
  2. Установка IronPython 2.7.2.1 .
  3. «C: \ Program Files \ Mono \ bin» или эквивалентный и «C: \ Program Files \ IronPython 2.7» или эквивалентный должен быть частью системного пути.
  4. И TestClass.py, и Program.cs должны находиться в одной папке.
  5. В командной строке dos, соответствующей папке, в которой существуют TestClass.py и Program.cs, выполните командный файл setmonopath.
  6. Из того же приглашения dos выполните следующую команду:

dmcs Program.cs / r: System / r: "C: \ Program Files \ IronPython 2.7 \ IronPython.dll" / r: "C: \ Program Files \ IronPython 2.7 \ IronPython.Modules.dll" / r: "C: \ Program Files \ IronPython 2.7 \ Microsoft.Dynamic.dll" / r: "C: \ Program Files \ IronPython 2.7 \ Microsoft.Scripting.dll" / r: "C: \ program Files \ IronPython 2.7 \ Microsoft. Scripting.MetaData.dll "/r:Microsoft.Csharp

Program.exe должен быть успешно сгенерирован, и то же самое можно выполнить без каких-либо сообщений об ошибках.

1 голос
/ 03 марта 2011

Ключевое слово dynamic определенно поддерживается Mono 2.8 при использовании профиля C # 4.

Я думаю, мой вопрос, как вы строите этот образец?просто вставил ваш образец в MonoDevelop.Я должен был сначала сказать MonoDevelop использовать C # 4 вместо C # 3.5.

Ключевое слово dynamic было введено в C # 4, очевидно.ссылки на сборки: System.Core, IronPython.dll, IronPython.Modules.dll, Microsoft.Dynamic.dll, Microsoft.Scripting.dll и Microsoft.CSharp.dll.Я не уверен, нужны ли мне они все.

Если вы собираете из командной строки, вам нужно использовать 'dmcs' в качестве компилятора (чтобы указать профиль .NET 4), и вам нужно включитьссылки на сборку.

Сборка без проблем с этой конфигурацией (по крайней мере для меня).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...