Когда вы компилируете код IronPython, он не компилируется в обычный код .NET, где у вас будет класс на уровне IL для каждого класса на уровне исходного кода. Вместо этого он компилируется в ту же форму, которую мы компилируем для внутреннего использования DLR.
Для пользовательского кода это просто набор исполняемых методов. Есть один метод для каждого модуля, определения функции и определения класса. Когда код модуля выполняется, он выполняется по словарю. В зависимости от того, что вы делаете в модуле, метод .NET может публиковать в словаре:
PythonType для классов нового стиля
OldClass для классов в старом стиле
Объект PythonFunction для функции
определения
Любые значения, которые вы назначаете (например,
Foo = 42)
Любые побочные эффекты выполнения exec без предоставления словаря (например, exec "x = 42")
- и т.д ...
Последний кусочек головоломки: где хранится этот словарь и как к нему добраться? Словарь хранится в объекте PythonModule, и мы создаем его, когда пользователь импортирует предварительно скомпилированный модуль, а затем запускаем модуль для него. Поэтому этот код доступен только через оператор импорта Python (или метод расширения в ScriptEngine «ImportModule», который предоставляется через класс IronPython.Hosting.Python).
Таким образом, весь макет кода рассматривается как внутренняя деталь реализации, которую мы оставляем за собой право изменять в любой момент времени.
Наконец, имя DLRCachedCode происходит потому, что DLR (внешний уровень) сохраняет этот код для нас. Несколько языков могут быть сохранены в одну DLL, если кто-то действительно хотел.