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

.NET секретам

 

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


Жаль, но Reflector не учитывает эту особенность. Если есть время, можешь написать Аисту баг-репорт :).

В результате эта строка кода должна выглядеть так:

panel1.Height = (int)((PanelHeaderSize)((PanelHeaderSize)((PanelHeaderSize)((PanelHeaderSize)this.m_NicePanel.Height) - this.m_NicePanel.Style.HeaderStyle.Size) - this.m_NicePanel.Style.FooterStyle.Size) - ((PanelHeaderSize)2));

Остаются еще две проблемы, связанные с этим несчастным перечислением :). Компилятор сообщает:

PureComponents.NicePanel\NicePanel.cs: Оператор '/' не может применяться к операндам типа 'PureComponents.NicePanel.PanelHeaderSize' и 'PureComponents.NicePanel.PanelHeaderSize'

Это происходит в строках 1704 и 1900. Вот правильный вид этих строк:

Первая:

int num2 = (int)(PanelHeaderSize)((((PanelHeaderSize) (this.Height - num1)) - this.Style.FooterStyle.Size) + ((int)this.Style.FooterStyle.Size / 2));

И вторая:

int num3 = (int) (((PanelHeaderSize) num1) + ((this.Style.HeaderStyle.Size - ((PanelHeaderSize) 2)) / 2));

Далее следуют более каверзные ошибки (синтаксические). Например, в классе NicePanelDesigner строка 135:

if(<PrivateImplementationDetails>.$$method0x60000d2-1 == null)

Тут запрятались сразу несколько ошибок. Знаки (>), ($) и (-) не могут использоваться в названиях методов, классов и т.д. Открыв эту сборку в Reflector’е, обнаружим, что метод $$method0x60000d2-1 действительно существует: кликнем на название этого метода и попадем в интересный класс (листинг 1).

internal class <PrivateImplementationDetails>

{

// Fields

internal static $$struct0x6000067-1 $$method0x6000067-1; // data size: 176 bytes

internal static Hashtable $$method0x60000d2-1;

internal static Hashtable $$method0x60000d2-2;

internal static $$struct0x6000157-1 $$method0x6000157-1; // data size: 512 bytes

// Nested Types

[StructLayout(LayoutKind.Explicit, Size=0xb0, Pack=1)]

private struct $$struct0x6000067-1

{

}

[StructLayout(LayoutKind.Explicit, Size=0x200, Pack=1)]

private struct $$struct0x6000157-1

{

}

}

Этот класс находится в пространстве имен ("-"), которое создается компилятором автоматически, в него входят глобальные поля, методы и классы, что, правда, не поддерживается в C# и наводит на мысли о присутствии некого защитного механизма. Кстати, из этого класса в проекте используется только одно поле $$method0x60000d2-1.

Чтобы исправить глюки, создадим класс Helper, а в нем — одно поле. Еще подправим все обращения к нему в строках 228, 148 и 135 (листинг 2).

using System;

using System.Collections;

namespace PureComponents.NicePanel.Design

{

public class Helper

{

public static Hashtable Hashtable1;

}

}

И последняя ошибка, которая должна быть исправлена:

Сбой криптографических служб при создании подписи сборки 'nicePanelKey.snk' -- Не удается найти указанный файл.

Этот закрытый ключ использован для цифровой подписи данного компонента. Чтобы исправить неприятность, заходим в файл AssemblyInfo.cs и смотрим на всякие атрибуты сборки, среди которых указаны:

Назад на стр. 066-058-2  Содержание  Вперед на стр. 066-058-4