2011-06-04 83 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