Назначение Emit.OpCodes в .NET для API приложений Windows Store?
Я рассматриваю перенос сторонней библиотеки в .NET для приложений Windows Store. Библиотека чрезмерно использует System.Reflection.Emit.OpCodes через вызовы перегрузок методов ILGenerator.Emit.
В API приложений для приложений .NET для Windows Store включены структура OpCode
и класс OpCodes
, но нет класса ILGenerator
, и насколько я не смог найти никакой замены.
Я, очевидно, что-то пропустил, но: без класса ILGenerator
, в чем заключается цель включения System.Reflection.Emit.OpCode
и OpCodes
в API приложений .NET для Windows Store?
Ответы
Ответ 1
Хороший вопрос. Хотя я не могу сказать точно, есть две причины, по которым я могу думать об использовании OpCode/Opcodes (и я не могу себе представить, что он используется для чего-то другого):
- Соберите фрагмент кода с помощью ILGenerator
- Разберите фрагмент кода, используя f.ex. MethodInfo.GetMethodBody, а затем разбор байтов, содержащих код IL
Поскольку он не первый, я думаю, они используют последний. Приложением для этого является анализ статического кода; Я сам использую его f.ex. для реализации некоторого поведения Mocking и выяснения того, что было передано ему лямбда-выражением (в этом случае выражения не могли быть использованы). Другими приложениями анализа кода, которые могут быть более вероятными в этом сценарии, является проверка того, используются ли определенные классы/методы/конструкции, которые запрещены (я могу представить, что они не хотят, чтобы вы использовали определенные функции).
Ответ 2
Вы можете найти Mono Cecil полезным для замены некоторых функций System.Reflection, официально нет порта для WinRT, но неофициально, имеется порт здесь, просто отметьте, что находится в версии Silverlight Mono Cecil.
Также имейте в виду, что вы не можете изменять dll и exes вне вашего пакета приложений, это мера безопасности изолированной программной среды WinRT.