Можно ли использовать управляемые указатели для изменения сборки .NET после ее загрузки в память?

#.net #pointers #clr #metaprogramming

#.net #указатели #Среда clr #метапрограммирование

Вопрос:

Учитывая, что .Формат таблицы сетевых метаданных содержит фактические RVA, которые показывают, где сборка может быть расположена в памяти, можно ли использовать управляемые указатели в среде CLR для доступа к местам в памяти, где хранится сборка, чтобы ее можно было изменять после ее загрузки в память?

Ответ №1:

Технически да, это возможно (при условии полного доверия небезопасный код) — указатели являются указателями, а управляемый код действительно является неуправляемым кодом после его JIT’ed. Тем не менее, это похоже на рецепт катастрофы для всего, что выходит за рамки экспериментов. Вы не сможете изменить IL, поскольку он, возможно, уже был обработан JIT, поэтому вам пришлось бы искать обработанный код и надеяться, что среда CLR не переместит его из-под вас или не переделает код (оба из которых разрешено делать).

Если вы действительно хотите это сделать, есть более простые способы — некоторые фреймворки метапрограммирования / макетирования используют CLR Profiling API для выполнения аналогичных трюков (запуск до, запуск после, замена метода impl и т.д.). Хотя даже это я бы не стал запускать в производство — простой способ вызвать событие, создающее возобновление, поскольку эти перехваты на самом деле не проверяются на стабильность в той же степени (например, они протекают, странным образом выходят из строя и т.д.). 🙂

Комментарии:

1. Если это технически возможно, то как бы это сделать?

2. Это может быть хорошим местом для начала.