我是如何折腾.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农场中有偷菜的说法,后来有人改称说叫摘菜,不叫偷,我这里也学文明人的方式,叫借用,希望能对你有帮助。

posted @ 2011-12-20 09:09  信息化建设  阅读(6679)  评论(2编辑  收藏  举报