我在单声道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的错误吗?
这是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放在执行二进制文件所在的同一目录中?
答案 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上从命令行成功构建和执行代码。以下是步骤:
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,并且可以执行相同的程序而不会出现任何错误消息。