Что такое динамические методы и чем DynamicMethod отличается от MethodBuilder? - PullRequest
13 голосов
/ 18 марта 2012

Я немного сталкивался с динамическими методами в коде C # на основе отражений, и мне еще предстоит точно выяснить, что они из себя представляют.В частности, существует класс DynamicMethod, который позволяет генерировать и специфицировать методы CLR во время выполнения.Но есть и класс MethodBuilder.Они оба, кажется, делают очень похожие вещи.Очевидно, что «динамические сборки» - это AssemblyBuilder классы, а «динамические типы» - это TypeBuilder классы.В любом случае все они находятся в пространстве имен System.Reflection.Emit.

Похоже, что в MSDN очень мало информации высокого уровня по этому вопросу.Поэтому, если бы кто-то мог объяснить, что такое динамические методы, где именно все классы XYZBuilder вступают в игру, и для чего они используются, это было бы здорово.Любые другие типы и функциональность Reflection.Emit, о которых я должен знать, также будут оценены.

1 Ответ

14 голосов
/ 18 марта 2012

Я думаю, документация для DynamicMethod объясняет это хорошо:

Вы можете использовать класс DynamicMethod для генерации и выполнения метода во время выполнения, не имеягенерировать динамическую сборку и динамический тип для содержания метода.Исполняемый код, созданный компилятором Just-in-Time (JIT), восстанавливается при освобождении объекта DynamicMethod.Динамические методы являются наиболее эффективным способом генерации и выполнения небольших объемов кода.

Если вам нужно динамически создать один или несколько методов, используйте DynamicMethod.Если вы хотите создать целые типы, это означает, что вам нужно создать динамическую сборку (AssemblyBuilder), затем создать внутри нее модуль (ModuleBuilder), а затем создать один или несколько типов (TypeBuilder).Чтобы создать методы внутри этих типов, вы должны использовать MethodBuilder.

Другое отличие состоит в том, что GC: * ​​1019 * s всегда может собирать мусор и собираться один за другим.То есть любой метод можно собрать, как только вы перестанете его использовать.Динамические сборки, с другой стороны, могут быть собраны, только если вы укажете это (используя AssemblyBuilderAccess.RunAndCollect), и они всегда собираются сборкой по сборке.Например, если у вас есть два типа в сборке, и вы используете только один из них, другой не может быть собран.

...