C# 从IronPython脚本访问主机类

C# 从IronPython脚本访问主机类,c#,ironpython,C#,Ironpython,如何从IronPython脚本访问C#类? C#: 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脚本访问C#类? C#:

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
更新


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

您已将
t
设置为
MyClass
的实例,但您试图将其当作类本身来使用

您需要从IronPython脚本中导入
MyClass
,或者注入某种工厂方法(因为类在C#中不是第一类对象,所以不能直接传入
MyClass
)。或者,您可以传入
typeof(MyClass)
并使用
System.Activator.CreateInstance(theMyClassTypeObject)
来新建实例

由于您还需要访问MyEnum(请注意,您在脚本中使用MyEnum时没有参考它的来源),因此我建议只使用导入:

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

您可能需要处理脚本源类型(我认为
文件
最有效)和脚本执行路径,才能成功调用
clr.AddReference()

我可以从外部程序集导入类。但是我需要使用宿主程序集中的类。启动python脚本的那个。我试图使用导入,但找不到执行此操作的方法。@Max:宿主程序集在任何方面都不是特别的--您需要从它导入,就像从任何其他程序集导入一样。您可以在
AddReference()
调用中放置其DLL的完整绝对路径——如果这样做有效,那么您就知道这只是路径/当前目录问题(这可能很烦人,但至少您会知道代码是否有效),因为脚本被托管,我确信不需要导入托管程序集。现在我已经试过了,我看到它起作用了。但奇怪的是,当我传递类实例并查询类名和模块时,类似乎已经是全局命名空间的一部分。
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