Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #66, МАЙ 2006 г.

недетское вскрытие .NET

N|M{INT3 TEAM}{NIM@INT3.RU}

Спецвыпуск: Хакер, номер #066, стр. 066-044-4


Итак, мы находимся в методе C1.Win.0V::Y3. В Reflector’е посмотрим этот метод и класс на наличие полезного кода. Забыл сказать, что в последних версиях Reflector’а добавлена возможность узнавать, где используется данный класс, метод или поле. Для этого на элементе дерева классов вызываешь контекстное меню и нажимаешь Analyser. В появившемся окне увидишь два элемента: Depends On и Used By («Зависит от» и «Используется в» соответственно). Быстро просмотрев 19 классов C1.WIN в анализаторе, мы обнаружили, что только пять используются за пределами пространства имен C1.WIN и все так или иначе относятся к мусору. Их тоже заносим в корзину.

1 internal class 0L : Attribute

-- Assembly C1.Win.C1TrueDBGrid

2 internal class 0M : Attribute

-- Assembly C1.Win.C1TrueDBGrid

3 internal class 0Q : Attribute

-- Assembly C1.Win.C1TrueDBGrid

4 internal class ProviderInfo : LicenseProvider

-- C1.Win.C1TrueDBGrid.TDBDropDesigner::DisplayAboutBox(object sender, EventArgs e);

-- C1.Win.C1TrueDBGrid.TDBGridDesigner::DisplayAboutBox(object sender, EventArgs e);

5 internal interface U

-- class C1TrueDBGrid : Frame, U, IC1ControlPrintable

Получается, что если эти 19 классов будут удалены, компонент неплохо похудеет :). Так зачем нашей программе лишний вес? Как видно по таблице, первые три класса используются в виде атрибутов сборки (врезка 1 — «Атрибуты сборки»).

1. атрибуты сборки (там же, где мы закомментировали .publickey)

.custom instance void C1.Win.'0M'::.ctor(string) = ( 01 00 24 32 31 42 31 31 44 35 37 2D 39 34 37 38 // ..$21B11D57-9478

2D 34 32 30 65 2D 41 32 42 32 2D 34 43 36 41 41 // -420e-A2B2-4C6AA

45 46 39 38 45 34 36 00 00 ) // EF98E46..

.custom instance void C1.Win.'0Q'::.ctor(string,

string,

string) = ( 01 00 24 73 75 70 70 6F 72 74 2E 74 64 62 67 72 // ..$support.tdbgr

69 64 2E 6E 65 74 40 63 6F 6D 70 6F 6E 65 6E 74 // id.net@component

6F 6E 65 2E 63 6F 6D 3A 6E 65 77 73 3A 2F 2F 6E // one.com:news://n

65 77 73 2E 63 6F 6D 70 6F 6E 65 6E 74 6F 6E 65 // ews.componentone

2E 63 6F 6D 2F 43 6F 6D 70 6F 6E 65 6E 74 31 2E // .com/Component1.

70 75 62 6C 69 63 2E 6E 65 74 2E 74 64 62 67 72 // public.net.tdbgr

69 64 00 00 00 ) // id...

.custom instance void C1.Win.'0L'::.ctor(string,

string) = ( 01 00 02 32 34 24 34 34 33 45 43 39 35 30 2D 38 // ...24$443EC950-8

37 44 33 2D 34 31 34 34 2D 41 42 38 33 2D 39 36 // 7D3-4144-AB83-96

38 39 45 44 37 44 33 30 43 33 00 00 ) // 89ED7D30C3..

Итак, комментируем строки 73*88. Далее на очереди два обработчика события в классах TDBDropDesigner и TDBGridDesigner. Когда удаляешь метод обработчика события, вместе с ним необходимо удалить строки кода, которые навешивают на него EventHandler. Правильные программисты делают это в методе инициализации void Initialize, который создается автоматически при создании форм и контролов и вызывается из конструктора класса. Начнем с метода TDBDropDesigner::DisplayAboutBox. Находим его в листинге: [.]class*TDBDropDesigner -> DisplayAboutBox*object и комментируем в строках 142891*142901. Теперь удалим инициализацию EventHandler. Заходим в метод [.]class*TDBDropDesigner -> Initialize.

Назад на стр. 066-044-3  Содержание  Вперед на стр. 066-044-5