DynamicMethod в Сесиле - PullRequest
       13

DynamicMethod в Сесиле

3 голосов
/ 17 апреля 2010

Есть ли что-нибудь похожее на Reflection.Emit.DynamicMethod в Сесиле? Спасибо.

  1. DynamicMethod

Редактировать:

Как насчет следующих вещей?

  1. EmitCall (например,
    IL.EmitCall (OpCodes.Callvirt, GetBuildKey, null); IL.Emit (OpCodes.Unbox_Any, dependencyType); )
  2. LocalBuilder (например, LocalBuilder resolving = ilContext.IL.DeclareLocal (typeof (bool));)
  3. System.Reflection.Emit.Label (например, метка существующийObjectNotNull = buildContext.IL.DefineLabel ();) // Мне нужно использовать TextMap?
  4. ILGenerator.BeginCatchBlock (например, ilContext.IL.BeginCatchBlock (typeof (Exception));)
  5. ILGenerator.MarkLabel (например, ilContext.IL.MarkLabel (параметрResolveFailed);)
  6. ILGenerator.EndExceptionBlock () (например, ilContext.IL.EndExceptionBlock ();)

1 Ответ

5 голосов
/ 02 июля 2010

Нет способа создать DynamicMethod с Cecil, и при этом у него нет эквивалента.

DynamicMethod сильно привязан к среде выполнения, а Сесил полностью отделен. У двух из них есть совершенно отдельная система типов. DynamicMethod должен быть динамичным и поэтому должен использовать систему типов System.Reflection, так как она доступна во время выполнения. Mono.Cecil имеет другое представление системы этого типа, подходящей для статического анализа, без необходимости фактически загружать сборку во время выполнения. Поэтому, если вы хотите использовать DynamicMethod, вы должны использовать его вместе со средой.

Этот вопрос первоначально задавался, iirc, в контексте сред выполнения без DynamicMethods или SRE, например, Compact Framework, где Cecil может использоваться для выдачи кода во время выполнения.

Конечно, это возможно, но тогда вам придется заплатить цену загрузки сборки, что немаловажно для CF-устройств. Это означает, что если бы вы могли каким-то образом эмулировать DynamicMethod, создавая сборку только с одним статическим методом с помощью Cecil, это звучит ужасно. Сборки не могут быть собраны (DynamicMethods), что делает его гигантской утечкой памяти.

Если вам нужно испускать код во время выполнения на Compact Framework, испускайте как можно меньше и испускайте как можно меньше сборок.

...