反编译具有资源文件的类

时间:2011-02-17 02:58:45

标签: c# .net resources reflector decompiler

我已经反编译了一个aplication exe来了解他们如何处理命令。但我不确切知道以下文件的类型。因为该文件是从继承自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);

但我不知道命令类是如何创建的。它们具有与资源类不同的语法。有谁能够帮我? 这是什么意思?如何实施这个案例?

Ough ..这是exploreCommand的基类:

CODE:

[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 :(得分:0)

资源的示例是将在应用程序中使用的字符串(文本),图像,图标等。可以将它们嵌入到程序集(exe / dll)中并从那里引用,而不是将它们作为不同的文件分发。在.NET中,资源管理器是一个辅助类来引用这些资源。同样,资源多次与特定类型(例如表单)相关联,并称为本地资源。在.NET中,本地资源按与其关联的类型进行分类 - 实质上,资源名称将具有关联的类型名称前缀。资源管理器将类型作为参数,然后您可以通过简单的名称/键(在类型名称中唯一)来引用相关资源。在您的情况下,您可以使用反射器查看与ExplorerCommands类型相关联的所有资源 - 它们将在特定resx下分类(或将具有诸如<Name space>.ExplorerCommands.<resource name>之类的名称)

因此,资源通常与代码逻辑无关 - 它们只是指示应用程序需要使用的一些常量文本或图像。

  

我不知道命令类是如何创建的。

从代码中可以看出,派生自CommandBinder的类公开了命令的属性 - 例如,ExplorerCommands具有AboutAccurate属性。属性getter反过来调用CommandBinder.GetCommandForCaller,它似乎是Commands的工厂方法。它在管理器中查找预先存在的commad,如果不是,则调用CreateCommand方法来创建命令。我相信资源与命令创建的关系不会有任何关系