从 IronPython 中的其他名称空间访问 C# 枚举和 类
Access C# Enums and Classes from other namespaces in IronPython
我坚持认为应该是 IronPython 与 C# 集成的一个相当基本的功能(当然,这是一个非常简化的示例)。下面是一个简单的多项目解决方案。第一个项目从一个命名空间
定义了一个枚举和一个class
namespace EnumTest
{
public class EnumTest
{
public enum FooEnum
{
FooOne = 101,
FooTwo = 102,
};
public EnumTest(FooEnum f)
{
_f = f;
}
}
}
然后,我有另一个包含所有 IronPython 的项目:运行time DLL、Python 模块和 C# class 运行s 来自文件的 python 脚本。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using IronPython.Hosting;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
namespace IronPythonRunner
{
public class IronPythonRunner
{
public IronPythonRunner()
{
ScriptEngine ironPythonEngine = Python.CreateEngine();
ScriptScope pythonScope = ironPythonEngine.CreateScope();
dynamic scope = pythonScope;
const string script = "c:/temp/try.py";
String scriptDir = Path.GetDirectoryName(script);
String ironPyDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\IronPythonDistributable\Lib";
ICollection<String> paths = ironPythonEngine.GetSearchPaths();
paths.Add(scriptDir);
paths.Add(ironPyDir);
ironPythonEngine.SetSearchPaths(paths);
ScriptSource source = ironPythonEngine.CreateScriptSourceFromFile(script);
try
{
source.Execute(pythonScope);
}
catch (Exception e)
{
Debug.WriteLine(e.ToString());
}
finally
{
ironPythonEngine.Runtime.Shutdown();
}
}
}
}
最后,我有一个 c# 项目,它是 运行 宁 python 脚本
的测试 GUI
using System;
using System.Windows.Forms;
namespace IronPythonNamespaceTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
IronPythonRunner.IronPythonRunner r = new IronPythonRunner.IronPythonRunner();
}
}
}
当我尝试 运行 以下 python 脚本时
print "hello world"
print str(FooEnum.FooOne)
t = EnumTest(FooEnum.FooTwo)
我得到了 "hello world" 输出,但随后我得到了 C# IronPython.Runtime.UnboundNameException: name 'FooEnum' is not defined。这让我想到了我的问题,我应该如何从我的 python 脚本中访问枚举和 class?
您需要导入程序集:
import clr
clr.AddReference("assembly_name")
from EnumTest import EnumTest
from EnumTest.EnumTest import FooEnum
我坚持认为应该是 IronPython 与 C# 集成的一个相当基本的功能(当然,这是一个非常简化的示例)。下面是一个简单的多项目解决方案。第一个项目从一个命名空间
定义了一个枚举和一个classnamespace EnumTest
{
public class EnumTest
{
public enum FooEnum
{
FooOne = 101,
FooTwo = 102,
};
public EnumTest(FooEnum f)
{
_f = f;
}
}
}
然后,我有另一个包含所有 IronPython 的项目:运行time DLL、Python 模块和 C# class 运行s 来自文件的 python 脚本。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using IronPython.Hosting;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
namespace IronPythonRunner
{
public class IronPythonRunner
{
public IronPythonRunner()
{
ScriptEngine ironPythonEngine = Python.CreateEngine();
ScriptScope pythonScope = ironPythonEngine.CreateScope();
dynamic scope = pythonScope;
const string script = "c:/temp/try.py";
String scriptDir = Path.GetDirectoryName(script);
String ironPyDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\IronPythonDistributable\Lib";
ICollection<String> paths = ironPythonEngine.GetSearchPaths();
paths.Add(scriptDir);
paths.Add(ironPyDir);
ironPythonEngine.SetSearchPaths(paths);
ScriptSource source = ironPythonEngine.CreateScriptSourceFromFile(script);
try
{
source.Execute(pythonScope);
}
catch (Exception e)
{
Debug.WriteLine(e.ToString());
}
finally
{
ironPythonEngine.Runtime.Shutdown();
}
}
}
}
最后,我有一个 c# 项目,它是 运行 宁 python 脚本
的测试 GUIusing System;
using System.Windows.Forms;
namespace IronPythonNamespaceTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
IronPythonRunner.IronPythonRunner r = new IronPythonRunner.IronPythonRunner();
}
}
}
当我尝试 运行 以下 python 脚本时
print "hello world"
print str(FooEnum.FooOne)
t = EnumTest(FooEnum.FooTwo)
我得到了 "hello world" 输出,但随后我得到了 C# IronPython.Runtime.UnboundNameException: name 'FooEnum' is not defined。这让我想到了我的问题,我应该如何从我的 python 脚本中访问枚举和 class?
您需要导入程序集:
import clr
clr.AddReference("assembly_name")
from EnumTest import EnumTest
from EnumTest.EnumTest import FooEnum