C#和IronPython集成

C#和IronPython集成,c#,ironpython,C#,Ironpython,我只想使用C#中的io.py编写一个文件,我使用以下代码: using Microsoft.Scripting.Hosting; using IronPython.Hosting; ... System.IO.Directory.SetCurrentDirectory( Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + "\IronPython\Lib"); ScriptRuntime py = Pytho

我只想使用C#中的
io.py
编写一个文件,我使用以下代码:

using Microsoft.Scripting.Hosting;
using IronPython.Hosting;
...

System.IO.Directory.SetCurrentDirectory(
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) +
"\IronPython\Lib");

ScriptRuntime py = Python.CreateRuntime();
dynamic io = py.UseFile("io.py");
dynamic f = io.open("tmp.txt", "w");

f.writelines("some text...");
f.close();
但当我运行程序时,运行时会给我一个:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException告诉没有重载writelines接受参数“1”

似乎那个方法不存在。。。但是在
io.py
文档中它是存在的

注意:
close
方法也是如此


有什么想法吗?

我只能告诉您如何使代码正常工作,但是我对IronPython没有太多经验,也不知道为什么要这样做(尽管我试图学习)。首先,似乎io模块是以一种特殊的方式处理的,并且有专门的(非动态)类。执行
io.open时
返回的是
PythonIOModule.\u IOBase
类的实例。你能行

var f = (PythonIOModule._IOBase) io.open("tmp.txt", "w");
请自己看看“writeline”方法(它是常规方法,不是动态方法)接受CodeContext实例作为第一个参数,第二个参数是lines。有趣的是,这个类本身已经包含了带有该CodeContext的字段,但出于某种原因,它是内部的,更糟糕的是,writelines(和其他方法)可以使用该CodeContext,而不需要我们提供外部的CodeContext。为什么要这样做?我不知道

因此,为了让代码正常工作,我们必须在某个地方找到CodeContext。一种方法是通过反射实现:

var context = (CodeContext) f.GetType().GetField("context", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(f);
另一种方法是自己制作:

var languageContext = HostingHelpers.GetLanguageContext(engine);
var context = new ModuleContext(io._io, new PythonContext(languageContext.DomainManager, new Dictionary<string, object>())).GlobalContext;
var languageContext=HostingHelpers.GetLanguageContext(引擎);
var context=newmoduleContext(io.\u io,new PythonContext(languageContext.DomainManager,new Dictionary()).GlobalContext;
这两种方法都可以工作,程序将成功地写入文件。完整工作样本:

static void Main(string[] args) {                        
    System.IO.Directory.SetCurrentDirectory(@"G:\Python27\Lib");
    var engine = Python.CreateEngine();            
    dynamic io = engine.ImportModule("io");            
    var  f = (PythonIOModule._IOBase) io.open("tmp.txt", "w");
    var languageContext = HostingHelpers.GetLanguageContext(engine);
    var context = new ModuleContext(io._io, new PythonContext(languageContext.DomainManager, new Dictionary<string, object>())).GlobalContext;            
    f.writelines(context, "some text....");
    f.close(context);
}
static void Main(字符串[]args){
System.IO.Directory.SetCurrentDirectory(@“G:\Python27\Lib”);
var engine=Python.CreateEngine();
动态io=引擎导入模块(“io”);
var f=(PythonIOModule._IOBase)io.open(“tmp.txt”,“w”);
var languageContext=HostingHelpers.GetLanguageContext(引擎);
var context=newmoduleContext(io.\u io,new PythonContext(languageContext.DomainManager,new Dictionary()).GlobalContext;
f、 书面语(上下文,“某些文本…”);
f、 密切(上下文);
}