недетское вскрытие .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. |