从IronPython脚本访问主机类

本文关键字:主机 访问 脚本 IronPython | 更新日期: 2023-09-27 17:58:19

如何从IronPython脚本访问C#类?C#:

public class MyClass
{
}
public enum MyEnum
{
    One, Two
}
var engine = Python.CreateEngine(options);
var scope = engine.CreateScope();
scope.SetVariable("t", new MyClass());
var src = engine.CreateScriptSourceFromFile(...);
src.Execute(scope);

IronPython脚本:

class_name = type(t).__name__     # MyClass
class_module = type(t).__module__ # __builtin__
# So this supposed to work ...
mc = MyClass() # ???
me = MyEnum.One # ???
# ... but it doesn't

更新

我需要导入在宿主程序集中定义的类。

从IronPython脚本访问主机类

您已经将t设置为MyClass实例,但您正试图将其用作类本身。

您需要从IronPython脚本中导入MyClass,或者注入某种工厂方法(由于类不是C#中的一流对象,因此无法直接传入MyClass)。或者,您可以传入typeof(MyClass)并使用System.Activator.CreateInstance(theMyClassTypeObject)新建一个实例。

由于您还需要访问MyEnum(请注意,您在脚本中使用它,而没有提及它可能来自哪里),因此我建议只使用imports:

import clr
clr.AddReference('YourAssemblyName')
from YourAssemblyName.WhateverNamespace import MyClass, MyEnum
# Now these should work, since the objects have been properly imported
mc = MyClass()
me = MyEnum.One

您可能需要考虑脚本源类型(我认为File效果最好)和脚本执行路径,才能使clr.AddReference()调用成功。