2011-10-18 69 views
1

我創建了一個簡單的python類,並將它的類型傳遞給.Net程序集,該程序試圖使用以下實例化它:Assembly.CreateInstance()或AppDomain.CreateInstanceAndUnwrap()不適用於IronPython類

AppDomain.CurrentDomain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName); 

這引發FileNotFoundException。

type.Assembly.FullName == 'Snippets.scripting, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' 

我可以在AppDomain.CurrentDomain中找到Assembly的名稱,所以我相信我沒關係。

爲了進一步縮小下來我嘗試:

type.Assembly.CreateInstance(type.FullName) 

在這種情況下,我得到一個MissingMethodException。下面是一個簡單的例子,演示了這一點:

IronPython 2.7 (2.7.0.40) on .NET 4.0.30319.239 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import clr 
>>> import System 
>>> class foo(System.Object): 
... pass 
... 
>>> type = clr.GetClrType(foo) 
>>> type.Assembly.CreateInstance(type.FullName) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: Constructor on type 'IronPython.NewTypes.System.Object_1$1' not 
found. 
>>> for ctor in type.GetConstructors(): 
... print ctor 
... 
Void .ctor(IronPython.Runtime.Types.PythonType) 

.Net只看到1個構造函數,並且需要參數。我需要我的類不需要任何參數,以便CreateInstance可以工作。我無法修改CreateInstance調用來添加參數 - 這不是我的代碼。

在這一點上,我正在吠叫錯誤的樹,或者我需要一種方法來創建一個具有不需要任何參數的構造函數的IronPython類。

回答

2

IronPython類不是普通的.NET類,因此對它們進行處理實際上並不奏效。 (explanation)IronPython確實支持__clrtype__鉤子,類似於標準的__metaclass__掛鉤,它允許IronPython編譯器生成一個「真實」的.NET類來備份Python類並啓用諸如你的場景。

直接使用__clrtype__相當困難,因爲它是一個低級別的鉤子。 ClrType sample包含clrtype.py,這使得使用__clrtype__顯着更容易;請查看zip中的sample.py以獲取如何使用它的示例。

這是一個IronPython領域沒有得到應有的重視,所以可能還有一些粗糙的邊緣。

+0

謝謝!這對於第二個問題非常有用。 type.Assembly.CreateInstance(type.FullName)現在完美工作。 不幸的是,我原來的問題仍然存在。嘗試通過AppDomain調用它時,我仍然收到FileNotFound異常,所以我仍然有一些挖掘工作要做。 我目前正在尋找這樣做的http://www.voidspace.org.uk/ironpython/dynamically_compiling.shtml來動態編譯一個C#類。我會創建一個DLL,但我還有其他一些問題。 – sherbang

+0

成功!我需要添加一個ResolveHandler來查找程序集,現在可以使用。 AppDomain.CurrentDomain.AssemblyResolve + = ResolveHandler – sherbang

相關問題