我是如何折腾.NET Resx资源文件的 当计算机中的资源已经足够多时,我们也要学会尽可能的借用
.NET Resx格式的资源文件在日常开发中用的比较多,它用来存储常用的资源,可以是位图,文本文件,或是任何的电脑文件。先来看一下,它的日常用法
直接在这里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来看看它的究竟
你可能在问一下问题,怎样的图标才能指定给Windows控件呢,符合怎样的规则。如上图所示,打开System.Windows.Forms.dll,另存Button.bmp这个图标,在Photoshop看一下它的属性就可以知道答案。
经过这么一回合,我对嵌入到.NET程序集中的资源也产生了浓厚的兴趣。请继续看我的折腾手法。
来看看这个图,它显示了程序集中的翻译资源字符串
正规的商业程序,它的规范性是做的很好的,所以我想借用它的这些字符串资源,但是直接在.NET Reflector是无法获取到的,只可以另存为.resources文件。.NET Refector的作者在创作它时,就想到了.resources格式的处理,所以它已经做好了.NET Resourcer来读写.resources格式的资源文件,如下图所示。
.NET框架经过几个版本的更新,当初保存在硬盘中的.NET Resourcer已经不能运行了。不过,.NET Resourcer开放了源代码,你可以获取它的代码,用Visual Studio重新打开重新生成一次,就不会发生运行时错误。
使用这个程序来编辑.Resx文件,那是相当的舒服。绿色,小巧,功能也足够。可是用了一段时间,我发现了它的一个不足,就是无法把.resources中的图片资源保存到本地中,这是个小小的缺陷。
如上图所示,我想把rejected_request_16所指的图片拷贝出来,怎么都找不到办法。于是,又找到这个办法
这是博客园的一位园友提供的程序,它可以把.resource文件转化成.resx文件,这样,在Visual Studio中打开转化后的.resx文件,可以把需要的图片文件另存为文件,以实现图片文件的提取。资源文件的格式转化的代码也比较简单,直接是API的调用(ResourceReader ,ResXResourceWriter)。它的文章名字是《分享如何反编译winform资源文件的详解》,作者陈国立,感谢它的劳动。
再试一下开放源码的ILSpy,它也只能把嵌入的资源文件.resource另存出来,也不是我需要的resx文件
Visual Studio Command Line有一个实用工具,可以直接把.resource文件转化为resx格式,命令如下所示
ResGen.exe ERP.resources ERP.resx
这样也实现了.resources格式转化为resx文件格式。
掌握了上面所说的技巧,相当于已经准备好了挖掘宝藏的工具,下面的就来练一下手,看看有那些可以挖掘的宝贝资源。
Code Smith一直是我喜欢的代码生成工具,也经常在上面做一些扩展应用。它没有依赖于于我们熟悉的SMO或DMO来获取数据库的元数据库,这一点我一直有些怀疑,于是用Reflector打开一看,秘密都在这里了
这张图也解释了大量的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中查找。
除了前面提到的获取资源的行为方式,我还以此观察到了另一种程序设计的方法。请看下图
Solid Framework是一套非常流行的PDF文件处理工具包。我曾经在《知识管理系统Data Solution研发日记之十四 如何以编程方式处理PDF格式文档》中有介绍,如果需要详细了解请参考那篇文章。
简要介绍这个框架的工作方式,如上图所示,它把需要工作的程序,执行文件全部压缩到SolidFramework.dll这个程序集中的资源文件中,在激活(Activate)PDF处理引擎后,它会把相关的执行文件,服务程序解压缩到一个目录中,然后以这个目录中的程序来处理PDF文档。这种运用资源文件的奇怪方式,一直令我感觉惊讶,也佩服人家,把资源文件的用途发挥到了极致。
QQ农场中有偷菜的说法,后来有人改称说叫摘菜,不叫偷,我这里也学文明人的方式,叫借用,希望能对你有帮助。