Типы отражения и аудита C # - PullRequest
1 голос
/ 04 марта 2011

Я пытаюсь выяснить, возможно ли с помощью отражения (или иным образом) «провести аудит» некоторого кода, чтобы обеспечить выполнение требований проверки - например, проверить, создает ли код какие-либо потоки (System.Threading.Thread) или использует другие BCL. Предполагается, что код уже скомпилирован в dll. Спасибо!

Ответы [ 5 ]

2 голосов
/ 04 марта 2011

Вы можете сделать это с отражением, если вы очень хорошо разбираетесь в IL.

    MethodBody mb = this.GetType().GetMethod( "Method", BindingFlags.Default ).GetMethodBody();
    byte[] bytes = mb.GetILAsByteArray();

Вероятно, гораздо больше проблем, чем оно того стоит; результирующий IL нужно будет проанализировать.

Анализатор IL (но несколько устаревший): http://www.codeproject.com/KB/cs/sdilreader.aspx, который сгенерирует для вас список кодов операций (см. OpCodes.Newobj для создания экземпляра потока).

2 голосов
/ 04 марта 2011

Посмотрите на FxCop. Он может загрузить скомпилированный двоичный файл (dll или exe) и выполнить проверку и проверку соответствия этому скомпилированному IL независимо от языка .NET, использованного для его написания.

Вы можете написать свои собственные правила - что бы вы сделали в этом случае, чтобы отлавливать случаи "= new Thread ()" и т. П.

1 голос
/ 04 марта 2011

Как уже говорили другие, рефлексия вам не поможет, поскольку она описывает только метаданные tpyes.

Тем не менее, проект Mono.Ceci l - это способ во время выполнения взглянуть на IL (промежуточный язык) типов в сборке. Хотя продукт Mono Framework совместим с Microsoft CLR.

0 голосов
/ 04 марта 2011

Отражение позволит вам проверять тело методов через MethodBase.GetMethodBody , что дает вам MethodBody для проверки.

Однако на этом уровне выимеют дело с необработанным IL в байтовом массиве, который вы должны анализировать от начала до конца, чтобы выяснить вызовы внешних методов, что они делают и т. д.

Так что это не будет красиво или просто, но, конечно, этовозможно.

0 голосов
/ 04 марта 2011

Отражение не позволяет проверять тело членов, только их подписи. Другими словами, он ничего не скажет вам о том, что конкретный метод или свойство делает , как он выглядит.

Чтобы сделать то, что вам нужно, вам нужно будет использовать что-то вроде ildasm.exe, чтобы превратить скомпилированный .dll или .exe в IL, затем перейдите через IL и посмотрите, не делает ли он что-то, против чего вы возражаете.

...