Assembly.CreateInstance()或AppDomain.CreateInstanceAndUnwrap()不适用于IronPython类

时间:2011-10-18 22:41:34

标签: ironpython

我创建了一个简单的python类,我将它的类型传递给尝试使用以下方法实例化的.Net程序集:

    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中按名称找到程序集,所以我相信我没关系。

为了进一步缩小范围,我尝试了:

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类。

1 个答案:

答案 0 :(得分:2)

IronPython类不是普通的.NET类,因此将它们视为不可行。 (explanation)IronPython支持__clrtype__钩子,类似于标准的__metaclass__钩子,它允许IronPython编译器生成一个“真正的”.NET类来支持Python类并启用它像你这样的场景。

直接使用__clrtype__非常困难,因为它是一个低级钩子。 ClrType sample包含clrtype.py,这使得与__clrtype__的合作变得更加容易;请查看zip中的sample.py,了解如何使用它。

这是IronPython的一个领域,它没有得到应有的关注,因此可能仍有一些粗糙的边缘。