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.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 с конструктором, не требующим никаких аргументов.


person sherbang    schedule 18.10.2011    source источник


Ответы (1)


Классы IronPython не являются обычными классами .NET, поэтому рассматривать их как таковые на самом деле не получается. (объяснение) IronPython поддерживает ловушка __clrtype__, аналогичная стандартной ловушке __metaclass__, которая позволяет компилятору IronPython генерировать «настоящий» класс .NET для поддержки класса Python и включения таких сценариев, как ваш.

Работать с __clrtype__ напрямую довольно сложно, так как это ловушка низкого уровня. образец ClrType содержит clrtype.py, что значительно упрощает работу с __clrtype__; Взгляните на sample.py в zip-архиве, чтобы увидеть, как его использовать.

Это область IronPython, которая не получила должного внимания, поэтому могут быть некоторые неровности.

person Jeff Hardy    schedule 19.10.2011
comment
Спасибо! Это отлично подходит для второй проблемы. type.Assembly.CreateInstance (type.FullName) теперь отлично работает. К сожалению, моя первоначальная проблема все еще остается в силе. Я все еще получаю исключение FileNotFound при попытке вызвать его через AppDomain, так что мне еще нужно покопаться. В настоящее время я собираюсь сделать это voidspace.org.uk/ironpython/dynamically_compiling.shtml для динамической компиляции класса C #. Я бы создал dll, но у меня есть другие проблемы с этим. - person sherbang; 20.10.2011
comment
Успех! Мне нужно было добавить ResolveHandler, чтобы найти сборку, теперь это работает. AppDomain.CurrentDomain.AssemblyResolve + = ResolveHandler - person sherbang; 20.10.2011