Есть ли в .NET способ доступа к байт-коду / IL / CLR, который запущен в данный момент? - PullRequest
1 голос
/ 13 апреля 2010

Мне бы хотелось иметь доступ к байт-коду, который в данный момент выполняется или готовится к запуску, чтобы обнаружить определенные инструкции и выполнить определенные действия (в зависимости от инструкций). Короче говоря, я хотел бы контролировать байт-код, чтобы добавить контроль безопасности (см. EDIT # 1 для объяснения).

Возможно ли это? Я знаю, что есть некоторые платформы AOP, которые уведомляют вас о конкретных событиях, таких как доступ к полю или вызов метода, но я бы хотел пропустить этот дополнительный слой и просто посмотреть на весь байт-код сам на протяжении всего выполнения заявки.

Я уже посмотрел на следующие вопросы (... среди многих других;)):
Предварительная обработка C # - Методы обнаружения
Какие существуют инструменты для байт-кода CLR / .NET?
а также несколько платформ AOP (хотя и не очень подробно, так как кажется, что они не выполняют то, что мне нужно), и я знаком с Mono.Cecil.

Я ценю альтернативные предложения, но я не хочу вводить издержки инфраструктуры AOP, когда мне действительно нужен доступ к байт-коду без всего, что они добавляют сверху, чтобы сделать его более удобным для пользователя (. .. по общему признанию очень полезный материал, когда вы не хотите идти на низком уровне).

Спасибо:)


РЕДАКТИРОВАТЬ # 1 : больше подробностей о том, что я хочу сделать.

По сути, у меня есть приложение на C #, и мне нужно отслеживать инструкции, которые оно хочет выполнить, чтобы обнаружить операции чтения или записи в поля (операции Ldfld и Stfld) и вставьте некоторые инструкции до того, как произойдет чтение / запись: мне может понадобиться установить блокировки или, если это не удастся, прервать операцию. Также мне может потребоваться обновить журнал чтения (в случае чтения) или журнал записи (в случае записи).

На самом деле, я действительно хотел бы заменить инструкцию чтения / записи своим собственным кодом, но в случае неудачи, думаю, мне удастся просто вставить некоторые инструкции до и после .


РЕДАКТИРОВАТЬ # 2: PostSharp

Дейв предлагает использовать PostSharp

Проблема в том, что во время компиляции я до сих пор не знаю, какие классы мне нужно переплетать, поэтому я бы хотел отложить это до их загрузки. Как я понимаю, это не возможно с PostSharp? Пожалуйста, поправьте меня, если я ошибаюсь.

Я знаю, что PostSharp делает статическое плетение во время загрузки , но, по-видимому, "в настоящее время нет" готового "способа выполнить это" (заметьте, однако, что этот пост из PostSharp 1.5, возможно, это изменилось). Я думаю, это все равно будет проще, чем делать все самому, но я не могу найти никакой информации о том, как PostSharp поможет мне в этом случае. Наверное, спрошу на форумах PostSharp.

Ответы [ 2 ]

1 голос
/ 01 июля 2010

Ответ - нет. Вы можете использовать (исключительно низкоуровневый и только неуправляемый код) Profiling API для получения уведомлений об определенных событиях, но не о доступе к полям, что я и хотел. Кроме того, он не должен использоваться в производстве:

(из предыдущей ссылки)

Профилирование в производственных средах с требованиями высокой доступности. API профилирования был создан для Поддержка диагностики во время разработки. Это не подверглось строгому тестирование требуется для поддержки производства окружающая среда.

1 голос
/ 13 апреля 2010

Что за «контроль безопасности»? Вы изучили безопасность доступа к коду, предоставляемую с платформой .NET?

http://msdn.microsoft.com/en-us/library/930b76w0%28VS.80%29.aspx

http://www.codeproject.com/KB/security/UB_CAS_NET.aspx

...