Декомпилировать класс, который имеет файл ресурсов - PullRequest
0 голосов
/ 17 февраля 2011

Я декомпилировал исполняемый файл приложения, чтобы узнать, как они обрабатывают команду. Но я не знаю точно, какой тип следующего файла. Потому что файл наследуется от суперкласса, который наследуется от system.windows.forms.component, но также этот файл имеет файл ресурсов (ExploreCommand.Resx) в отражателе.

[DesignerCategory("Accurate Command Binders"), ToolboxItem(true), DesignTimeVisible(true)] 
internal class ExplorerCommands : CommandBinder 
{ 
    // Fields 
    private static readonly ResourceManager resources = new ResourceManager(typeof(ExplorerCommands)); 

    // Methods 
    protected ExplorerCommands() 
    { 
    } 

    public ExplorerCommands(Control control) : base(control) 
    { 
    } 

    // Properties 
    [Browsable(false)] 
    public Command AboutAccurate    { 
        get 
        { 
            return base.GetCommandForCaller("AboutAccurate ", "CitraKarya.Bisnis.Akunting.UI.Explorer.AboutAccurate ", ""); 
        } 
    }

На каждой форме, использующей этот класс, они объявлялись так:

this.reportCommands = new CitraKarya.Akunitng.UI.ReportCommands (this);

но я не знаю, как создавался командный класс. У них есть синтаксис, отличный от класса ресурса. Кто-нибудь может мне помочь? Что это значит? И как реализован этот случай?

Ух ... а это базовый класс для exploreCommand:

КОД:

[DesignerCategory(""), DesignTimeVisible(false), Designer(typeof(CommandBinderDesigner), typeof(IDesigner)), ProvideProperty("Command", typeof(object)), TypeConverter(typeof(CommandBinderTypeConverter)), ToolboxItem(false)] 
public abstract class CommandBinder : Component 
{ 
              // Methods 
    protected CommandBinder() 
    { 
        this.commands = new Dictionary<object, Command>(); 
        this.InitializeComponent(); 
    } 

    protected CommandBinder(Control parentControl) 
    { 
        this.commands = new Dictionary<object, Command>(); 
        this.parentControl = parentControl; 
        IComponent component = parentControl; 
        if ((component.Site != null) && (component.Site.Container != null)) 
        { 
            component.Site.Container.Add(this); 
        } 
        this.InitializeComponent(); 
    } 

 protected Command GetCommandForCaller(string propertyName, string id, string category) 
    { 
        CommandManager commandManager = CommandManager; 
        Command command = null; 
        if (commandManager != null) 
        { 
            command = commandManager.Commands[id]; 
        } 
        if (command == null) 
        { 
            command = CreateCommand(propertyName, id, category); 
            if (commandManager != null) 
            { 
                commandManager.Commands.Add(command); 
                return command; 
            } 
            CommandsToBeAdded.Add(command); 
        } 
        return command; 
    }


}

1 Ответ

0 голосов
/ 17 февраля 2011

Примером ресурсов являются строки (текст), изображения, значки и т. Д., Которые будут использоваться в приложении.Вместо того, чтобы распространять их как разные файлы, можно встраивать их в сборку (exe / dll) и ссылаться оттуда.В .NET менеджер ресурсов является вспомогательным классом для обращения к этим ресурсам.Снова много раз, ресурсы связаны с определенным типом (таким как форма) и известны как локальные ресурсы.В .NET локальные ресурсы классифицируются по типу, с которым они связаны - по существу, имя ресурса будет иметь префикс имени связанного типа.Менеджер ресурсов будет принимать тип в качестве аргумента, и тогда вы сможете ссылаться на связанные ресурсы простым именем / ключом (который уникален в имени типа).В вашем случае вы можете использовать рефлектор, чтобы просмотреть все ресурсы, связанные с типом ExplorerCommands - они будут отнесены к определенной категории (или будут иметь имя, например <Name space>.ExplorerCommands.<resource name>)

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

Я не знаю, как был создан класс команд.

Из кода выясняется, что классы, производные от CommandBinder, предоставляют свойства для команд - например, ExplorerCommands имеетAboutAccurate собственность.Получатель свойства, в свою очередь, вызывает CommandBinder.GetCommandForCaller, который представляется фабричным методом для команд.Он ищет в менеджере уже существующие запятые и, если нет, вызывает метод CreateCommand для создания команды.Я считаю, что ресурсы не будут иметь никакого отношения, поскольку создание команды идет далеко

...