IronPython 类不是.NET 类。它们是 Python 元类 IronPython.Runtime.Types.PythonType 的实例。这是因为 Python 类是动态的,并且支持在运行时添加和删除方法,这是 .NET 类无法做到的。
要在 C# 中使用 Python 类,您需要使用 ObjectOperations 类。此类允许您以语言本身的语义对 python 类型和实例进行操作。例如,它在适当的时候使用魔术方法,自动将整数提升为长整数等。您可以通过查看源代码或使用反射器来了解有关 ObjectOperations 的更多信息。
这是一个例子。Calculator.py 包含一个简单的类:
class Calculator(object):
def add(self, a, b):
return a + b
您可以在 .NET 4.0 C# 之前的代码中使用它,如下所示:
ScriptEngine engine = Python.CreateEngine();
ScriptSource source = engine.CreateScriptSourceFromFile("Calculator.py");
ScriptScope scope = engine.CreateScope();
ObjectOperations op = engine.Operations;
source.Execute(scope); // class object created
object klaz = scope.GetVariable("Calculator"); // get the class object
object instance = op.Call(klaz); // create the instance
object method = op.GetMember(instance, "add"); // get a method
int result = (int)op.Call(method, 4, 5); // call method and get result (9)
您将需要引用程序集 IronPython.dll、Microsoft.Scripting 和 Microsoft.Scripting.Core。
C# 4 使用新的动态类型使这变得更加容易。
ScriptEngine engine = Python.CreateEngine();
ScriptSource source = engine.CreateScriptSourceFromFile("Calculator.py");
ScriptScope scope = engine.CreateScope();
source.Execute(scope);
dynamic Calculator = scope.GetVariable("Calculator");
dynamic calc = Calculator();
int result = calc.add(4, 5);
如果您使用带有 NuGet 支持的 Visual Studio 2010 或更高版本,只需执行此操作即可下载并引用相应的库。
Install-Package IronPython