почему некоторые библиотеки IronPython генерируются внутри класса DLRCachedCode? - PullRequest
2 голосов
/ 23 февраля 2010

когда я компилирую некоторые .py кодовые файлы без определений классов в dll, скомпилированная dll создается с классом "DRLCachedCode" внутри. Почему это так?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2010

Когда вы компилируете код IronPython, он не компилируется в обычный код .NET, где у вас будет класс на уровне IL для каждого класса на уровне исходного кода. Вместо этого он компилируется в ту же форму, которую мы компилируем для внутреннего использования DLR.

Для пользовательского кода это просто набор исполняемых методов. Есть один метод для каждого модуля, определения функции и определения класса. Когда код модуля выполняется, он выполняется по словарю. В зависимости от того, что вы делаете в модуле, метод .NET может публиковать в словаре:

  • PythonType для классов нового стиля

  • OldClass для классов в старом стиле

  • Объект PythonFunction для функции определения

  • Любые значения, которые вы назначаете (например, Foo = 42)

  • Любые побочные эффекты выполнения exec без предоставления словаря (например, exec "x = 42")

  • и т.д ...

Последний кусочек головоломки: где хранится этот словарь и как к нему добраться? Словарь хранится в объекте PythonModule, и мы создаем его, когда пользователь импортирует предварительно скомпилированный модуль, а затем запускаем модуль для него. Поэтому этот код доступен только через оператор импорта Python (или метод расширения в ScriptEngine «ImportModule», который предоставляется через класс IronPython.Hosting.Python).

Таким образом, весь макет кода рассматривается как внутренняя деталь реализации, которую мы оставляем за собой право изменять в любой момент времени.

Наконец, имя DLRCachedCode происходит потому, что DLR (внешний уровень) сохраняет этот код для нас. Несколько языков могут быть сохранены в одну DLL, если кто-то действительно хотел.

0 голосов
/ 13 июня 2011

Эта ссылка отвечает на вопрос: http://www.ironpython.info/index.php/Using_Compiled_Python_Classes_from_.NET/CSharp_IP_2.6 как получить доступ к классу IronPython из C #.

Ручная компиляция: \ IronPython 2.7 \ Tools \ Scripts> ipy pyc.py / out: MyClass / target: dll MyClass.py не работает. Только когда я использовал SharpDevelop с IronPython, он работал как в посте.

...