mono 2.8是否支持“动态”关键字?

时间:2010-10-13 01:17:07

标签: dynamic c#-4.0 mono

我在单声道2.8上测试了IronPython,其中的代码在Professional 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'关键字。

这是Mono 2.8的错误吗?

ADDED

这是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

它编译得很好,但是当我运行执行二进制文件时它仍然会中断。我是否需要将所有dll放在执行二进制文件所在的同一目录中?

3 个答案:

答案 0 :(得分:3)

您获得Microsoft.CSharp.RuntimeBinder.RuntimeBinderException的事实意味着动态关键字有效。你遇到的问题是IPY.UseFile(“TestClass.py”);返回没有看到测试方法的ScriptScope。所以问题出在你的python源码或你如何将IronPython包含在单声道中。

答案 1 :(得分:1)

使用C#4配置文件时,Mono 2.8肯定支持dynamic关键字。

我想我的问题是你是如何构建这个样本的?

只是为了踢,我只是将你的样本粘贴到MonoDevelop中。我不得不告诉MonoDevelop首先使用C#4而不是C#3.5。

显然在C#4中引入了dynamic关键字。

此外,我确实必须包含一些程序集引用:System.Core,IronPython.dll,IronPython.Modules.dll,Microsoft.Dynamic.dll,Microsoft.Scripting.dll和Microsoft.CSharp.dll。我不确定我是否需要它们。

如果要从命令行构建,则需要使用“dmcs”作为编译器(以指示.NET 4配置文件),并且需要包含程序集引用。

它的构建没有问题(至少对我来说)。

答案 2 :(得分:1)

关于Mono 2.10,我正在回答这个问题。

我可以在不使用MonoDevelop的情况下在Windows 7上从命令行成功构建和执行代码。以下是步骤:

  1. 在Windows 7上安装Mono 2.10.8
  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提示符执行以下命令:
  7. 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,并且可以执行相同的程序而不会出现任何错误消息。