zoukankan      html  css  js  c++  java
  • 我是如何折腾.NET Resx资源文件的 当计算机中的资源已经足够多时,我们也要学会尽可能的借用

    .NET Resx格式的资源文件在日常开发中用的比较多,它用来存储常用的资源,可以是位图,文本文件,或是任何的电脑文件。先来看一下,它的日常用法

    image

    直接在这里Paste一个位图文件,然后在程序中以这种方式调用,非常的简洁明了

    Bitmap bitmap = Resources.Button;

    在知道这种方法之前,我一直是用Embedded Resource的方法,代码如下

    public static System.Drawing.Image GetImage(string fileName)
    {
          string path = string.Format("Foundation.Common.Resource._{0}.{1}", _language, fileName);
          Assembly assembly = Assembly.GetExecutingAssembly();
          Stream picture = assembly.GetManifestResourceStream(path);
          return Image.FromStream(picture);
    }
    Bitmap bitmap=GetImage("Button");

    前一种方式简单,但是没有后一种方法灵活,嵌入的资源可以编程访问,则具备相当的灵活性。比如在制作多国语言环境的程序中,简体中文要加载zh_cn_Button文件,英语则加载en_us_Button资源文件,在这种情况下,则推荐以嵌入的资源的方式来实现。

    在设计Windows Forms组件时,通常为给它赋一个图标资源,代码看起来是这样的

    [ToolboxBitmap(typeof(MyControl),"Button")]
    public class MyButtonControl : Control
    {
          
    }

    指定资源文件名是Button,请注意给它设定属性为嵌入的资源。这样,在VS的工具箱中,它显示图标为按钮。

    指定控件工具箱的这段代码还有更简洁的写法,如下所示

    [ToolboxBitmap(typeof(System.Windows.Forms.Button))]
    public class MyControl : Control
    {
    
    }

    直接使用Windows.Forms的内置图标,简单明了,不过它驱使我用Reflector来看看它的究竟

    image

    你可能在问一下问题,怎样的图标才能指定给Windows控件呢,符合怎样的规则。如上图所示,打开System.Windows.Forms.dll,另存Button.bmp这个图标,在Photoshop看一下它的属性就可以知道答案。

    经过这么一回合,我对嵌入到.NET程序集中的资源也产生了浓厚的兴趣。请继续看我的折腾手法。

    来看看这个图,它显示了程序集中的翻译资源字符串

    image

    正规的商业程序,它的规范性是做的很好的,所以我想借用它的这些字符串资源,但是直接在.NET Reflector是无法获取到的,只可以另存为.resources文件。.NET Refector的作者在创作它时,就想到了.resources格式的处理,所以它已经做好了.NET Resourcer来读写.resources格式的资源文件,如下图所示。

    image

    .NET框架经过几个版本的更新,当初保存在硬盘中的.NET Resourcer已经不能运行了。不过,.NET Resourcer开放了源代码,你可以获取它的代码,用Visual Studio重新打开重新生成一次,就不会发生运行时错误。

    使用这个程序来编辑.Resx文件,那是相当的舒服。绿色,小巧,功能也足够。可是用了一段时间,我发现了它的一个不足,就是无法把.resources中的图片资源保存到本地中,这是个小小的缺陷。

    image

    如上图所示,我想把rejected_request_16所指的图片拷贝出来,怎么都找不到办法。于是,又找到这个办法

    image 

    这是博客园的一位园友提供的程序,它可以把.resource文件转化成.resx文件,这样,在Visual Studio中打开转化后的.resx文件,可以把需要的图片文件另存为文件,以实现图片文件的提取。资源文件的格式转化的代码也比较简单,直接是API的调用(ResourceReader ,ResXResourceWriter)。它的文章名字是《分享如何反编译winform资源文件的详解》,作者陈国立,感谢它的劳动。
    再试一下开放源码的ILSpy,它也只能把嵌入的资源文件.resource另存出来,也不是我需要的resx文件

    image

    Visual Studio Command Line有一个实用工具,可以直接把.resource文件转化为resx格式,命令如下所示

    ResGen.exe ERP.resources  ERP.resx

    这样也实现了.resources格式转化为resx文件格式。

    掌握了上面所说的技巧,相当于已经准备好了挖掘宝藏的工具,下面的就来练一下手,看看有那些可以挖掘的宝贝资源。

    Code Smith一直是我喜欢的代码生成工具,也经常在上面做一些扩展应用。它没有依赖于于我们熟悉的SMO或DMO来获取数据库的元数据库,这一点我一直有些怀疑,于是用Reflector打开一看,秘密都在这里了

    image

     

    这张图也解释了大量的SQL Server元数据技巧,比如你要获取SQL Server 2005的所有的数据表,可以看到Code Smith写的代码是这样的

    GetTables2005=SELECT
        object_name(so.id)        AS [OBJECT_NAME],
        schema_name(so.uid)        AS [USER_NAME],
        so.type                    AS TYPE,
        so.crdate                AS DATE_CREATED,
        fg.file_group            AS FILE_GROUP,
        so.id                    as [OBJECT_ID]
        FROM
        dbo.sysobjects so
        LEFT JOIN (
            SELECT
                s.groupname AS file_group,
                i.id        AS id
            FROM dbo.sysfilegroups s
                INNER JOIN dbo.sysindexes i
                ON i.groupid = s.groupid
            WHERE i.indid < 2                          
        ) AS fg
        ON so.id = fg.id
       WHERE
        so.type = N'U'
        AND permissions(so.id) & 4096 <> 0
        AND ObjectProperty(so.id, N'IsMSShipped') = 0
        AND NOT EXISTS (SELECT * FROM sys.extended_properties WHERE major_id = so.id AND name = 'microsoft_database_tools_support' AND value = 1)
    ORDER BY schema_name(so.uid), object_name(so.id)
    这样,我再也不用为获取SQL Server的元数据发愁了,也不用Google帮忙,这里就有我需要的全部了。

    相应的MySQL可以到SchemaExplorer.MySQLSchemaProvider.dll中去找,与Oracle相关的在SchemaExplorer.OracleSchemaProvider.dll中查找。

    除了前面提到的获取资源的行为方式,我还以此观察到了另一种程序设计的方法。请看下图

    image

    Solid Framework是一套非常流行的PDF文件处理工具包。我曾经在《知识管理系统Data Solution研发日记之十四 如何以编程方式处理PDF格式文档》中有介绍,如果需要详细了解请参考那篇文章。

    简要介绍这个框架的工作方式,如上图所示,它把需要工作的程序,执行文件全部压缩到SolidFramework.dll这个程序集中的资源文件中,在激活(Activate)PDF处理引擎后,它会把相关的执行文件,服务程序解压缩到一个目录中,然后以这个目录中的程序来处理PDF文档。这种运用资源文件的奇怪方式,一直令我感觉惊讶,也佩服人家,把资源文件的用途发挥到了极致。

    QQ农场中有偷菜的说法,后来有人改称说叫摘菜,不叫偷,我这里也学文明人的方式,叫借用,希望能对你有帮助。

  • 相关阅读:
    TCP/IP详解学习笔记
    C++知识库
    C++中基类的析构函数为什么要用virtual虚析构函数
    秒杀多线程面试题系列
    很详细全部的WinDbg学习资料
    Ubuntu中libprotobuf版本冲突的解决方案
    Windows系统中内存泄露与检测工具及方法
    Ubuntu脚本修改IP信息
    【Qt】Qt Quick 之 QML 与 C++ 混合编程详解
    分布式系统消息中间件——RabbitMQ的使用基础篇
  • 原文地址:https://www.cnblogs.com/JamesLi2015/p/2294156.html
Copyright © 2011-2022 走看看