2011-06-04 82 views
5

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

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 

UPDATE

我需要导入一个托管组件定义的类。

回答

3

您已将t设置为实例MyClass,但您正在尝试使用它,就好像它是类本身一样。

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

既然你还需要访问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 

你可能要玩用脚本源类型(我认为File最好)和脚本执行路径来获得clr.AddReference()调用成功。

+0

我可以从外部程序集导入一个类。但我需要使用宿主程序集中的一个类。启动python脚本的那个。我试图玩弄导入,但无法找到一种方法来做到这一点。 – Max 2011-06-04 09:25:51

+0

@Max:主机程序集并不是什么特别的 - 你需要像从任何其他程序集那样从它导入。你可以在它的'AddReference()'调用中放入完整的绝对路径给它的DLL - 如果这样做,那么你知道它只是一个路径/当前目录问题(这可能很烦人,但至少你会知道是否该代码是否有效) – Cameron 2011-06-04 14:02:02

+0

由于脚本被托管,我确信我不需要导入托管程序集。现在,我已经尝试过,我发现它正在工作。奇怪的是,当我通过类实例并查询类名和模块时,它看起来像这个类已经是全局名称空间的一部分。 – Max 2011-06-04 19:39:44