Многие разработчики на платформе .NET в какой-то момент сталкиваются с необходимостью изучения внутренностей чужих компонентов в виде DLL, от которых нет исходного кода.

В частности, многие разработчики SharePoint страдают от недостатка документации, в этой связи приходится прибегать к декомпиляции кода.

Этот механизм вполне легален и лежит в основе .NET framework. В DLL библиотеках находится не только код, скомпилированный в виде MSIL (Microsoft intermediate language), но и метаданные – информация обо всех классах, их методах и свойствах.

При помощи объектной модели отражения (reflection) можно открыть любую .NET библиотеку и получить всю необходимую информацию, создать экземпляры классов и вызвать необходимые методы, включая закрытые (private, internal).

http://msdn.microsoft.com/ru-ru/library/system.reflection(v=VS.90).aspx

Вот только работать с MSIL кодом неудобно – трактовать его конструкции тяжело – это больше похоже на ассемблер, чем на алгоритмический язык программирования.

Здесь на помощь приходят различные инструменты.

Бесплатный до недавнего времени инструмент .NET Reflector был одним из лучших, но сейчас он стоит от $35, что не так уж и много – http://www.reflector.net/

Есть бесплатные альтернативы, отличающиеся по функциональности и качеству исполнения:

IL Spy - http://wiki.sharpdevelop.net/ilspy.ashx

Telerik JustDecompile - http://www.telerik.com/products/decompiler.aspx

CCI Explorer - http://cciexplorer.codeplex.com/

Если кто-то знает другие инструменты – напишите мне!

Что можно узнать при помощи reflection?

Например, как добавляются элементы в список:

При этом, щелкнув на вызов метода в коде, можно углубиться ещё дальше.

В каких случаях reflection не работает?

1 – в некоторых случаях все упирается в вызов внешней функции DLL или COM объекта.

2 – применен механизм Obfuscation – намеренное запутывание кода разработчиками для затруднения декомпиляции.

Что делать дальше?

Во-первых, таким образом, исследуя код, Вы можете понять причину возникновения проблем в Вашем коде.

Во-вторых, Вы можете унаследовать отдельные классы и переопределить не до конца документированные методы.

Ну, и наконец, Вы можете напрямую вызвать зарытые методы, если очень нужно!