(C#/Mono.Cecil) Определение всех инструкций выхода метода с использованием только кодов операцийC#

Место общения программистов C#
Ответить
Anonymous
 (C#/Mono.Cecil) Определение всех инструкций выхода метода с использованием только кодов операций

Сообщение Anonymous »

При создании игры на Unity я искал решение, похожее на OnMethodBoundaryAspect.OnExit PostSharp, как описано в этом блоге.
Однако не похоже, что PostSharp можно использовать с Unity, если только вы не создадите его как DLL (и даже тогда неясно, какие платформы будут его поддерживать, следует ли использовать более старую версию и т. д.).
Я рассматривал стороннюю библиотеку под лицензией MIT, которая использует Mono.Cecil для создания эквивалентных определений OnEntry/OnExit, но не фиксирует исключения в OnExit, а просто вставляет вызов перед последним Инструкция в функции.
Учитывая, что генерацию/повторную генерацию исключения можно попробовать/перехватить, как можно определить по последовательности инструкций (каждая из которых имеет код операции), которая инструкции действительно выходят из функции?
Пытался вставить перед каждым OpCodes.Ret, что было хорошо для ранних вызовов возврата, но, очевидно, обнаружил, что обработка исключений не будет использовать OpCodes .Ret и просто проверка OpCodes.Throw/

Код: Выделить всё

OpCodes.Rethrow
не указывает, что будет выходить из функции.
Изменить: также реализована проверка OpCodes.Ret, которая не очень хорошо сочетается с использованием сопрограммой «возврата доходности».
Edit2: Исключения, создаваемые функциями, вызываемыми в теле функции, таким образом не будут обнаружены.
Edit3: Функции, которые заканчиваются операторами итератора, такими как foreach, не завершаются с помощью OpCodes.Ret.< /п>

Подробнее здесь: https://stackoverflow.com/questions/790 ... st-opcodes
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»