Assembly.CreateInstance() 或 AppDomain.CreateInstanceAndUnwrap() 不适用于 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中的名称找到程序集。当前域,所以我相信我在那里没问题。

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

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只看到一个构造函数,并且需要一个参数。我需要我的类不需要任何参数,所以CreateInstance将工作。我不能修改CreateInstance调用来添加参数——那不是我的代码。

要么我现在找错了树,要么我需要一种方法来创建一个IronPython类,该类具有不需要任何参数的构造函数

IronPython类并不是普通的。net类,所以这样对待它们是行不通的。(解释)IronPython确实支持__clrtype__钩子,类似于标准的__metaclass__钩子,它允许IronPython编译器生成一个"真正的"。net类来支持Python类,并启用像你这样的场景。

直接使用__clrtype__是相当困难的,因为它是一个低级的钩子。ClrType样品含有clrtype.py,这使得__clrtype__的处理明显容易;请查看zip中的sample.py,以了解如何使用它。

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

相关内容

最新更新