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

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

1 Ответ

1 голос
/ 17 апреля 2011

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

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

...