.Net的资源文件

VS.Net 支持三种文件类型的resource:.txt、.resx、.resources。

system.resources 名字空间支持三种资源文件:

    • txt 文件,只能有字符串资源。因为不能被嵌入到 assembly 中,所以非常容易暴露,被客户修改。最大缺点是仅支持字符串资源,所以不推荐使用。
    • .resx 文件,由 xml 组成,能加入所有资源,包括二进制。同样不能被嵌入到 assembly 中。在 system.resources 名字空间中有专用读写的类。vs.net 创建这种文件然后将其转成 .resources 文件并根据设置将其嵌入到 assembly 中。
    • .resources 文件,pe 格式,能加入所有资源。唯一能被嵌入到 assembly 的文件,在 system.resources 名字空间中有专用读写的类。
  1. 把resx文件通过vs加入到.net工程中后,编译完成时,它会被转化为resources文件并embed到assembly中。
  2. System.resources.resourceManager负责读取.net assembly中嵌入的resources文件中的资源信息。
  3. 三种文件类型,必须要转为resources文件,才能被resourcemanager读取(显然的)。ResGen.exe主要完成此项工作。
  4. C++/CLI, vb.net, c#,大家都可以用resx文件是自然的。只不过在Vs里添加resx文件时,c#工程要支持的更完备些:直接替你封装好了对resourcemanager的使用。
  5. 推荐工具
    • resgen.exe:sdk 中的工具,专门用来做资源文件类型之间的转换。支持 .txt <-> .resx <-> .resources 之间的转换。
    • resourcer:专门用来创建资源文件,简单易用,支持 .resx 和 .resources 文件格式。
    • .net reflector:用来浏览 assembly。如果你不确定一个资源文件的完整名时能用这个工具在 assembly 中查看。

ResX资源文件中图标的提取

ResX文件中,是将所有资源(包括二进制)都写入到XML文件中,每个图标不再以独立文件的形式存在。在编程工程中,尤其在学习、分析现有.Net应用程序过程中,需要提取现有应用程序中的图标。基本思路是利用工具软件,将应用程序的资源文件提取出来(具体方法可以进行网上搜索),生成resx或resources文件。当生成resources文件时,可以利用resgen.exe进行格式转换。

通过对resx文件格式分析,开发了针对resx格式文件的图标提取工具,本工具的具体代码如下:

界面设计代码:

  1 <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
2 Partial Class frmMain
3 Inherits System.Windows.Forms.Form
4
5 'Form 重写 Dispose,以清理组件列表。
6 <System.Diagnostics.DebuggerNonUserCode()> _
7 Protected Overrides Sub Dispose(ByVal disposing As Boolean)
8 Try
9 If disposing AndAlso components IsNot Nothing Then
10 components.Dispose()
11 End If
12 Finally
13 MyBase.Dispose(disposing)
14 End Try
15 End Sub
16
17 'Windows 窗体设计器所必需的
18 Private components As System.ComponentModel.IContainer
19
20 '注意: 以下过程是 Windows 窗体设计器所必需的
21 '可以使用 Windows 窗体设计器修改它。
22 '不要使用代码编辑器修改它。
23 <System.Diagnostics.DebuggerStepThrough()> _
24 Private Sub InitializeComponent()
25 Me.components = New System.ComponentModel.Container()
26 Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmMain))
27 Me.ImageList1 = New System.Windows.Forms.ImageList(Me.components)
28 Me.ListView1 = New System.Windows.Forms.ListView()
29 Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog()
30 Me.MenuStrip1 = New System.Windows.Forms.MenuStrip()
31 Me.FleToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
32 Me.mnuFileOpen = New System.Windows.Forms.ToolStripMenuItem()
33 Me.mnuFileExport = New System.Windows.Forms.ToolStripMenuItem()
34 Me.mnuFileExit = New System.Windows.Forms.ToolStripMenuItem()
35 Me.FolderBrowserDialog1 = New System.Windows.Forms.FolderBrowserDialog()
36 Me.MenuStrip1.SuspendLayout()
37 Me.SuspendLayout()
38 '
39 'ImageList1
40 '
41 Me.ImageList1.ImageStream = CType(resources.GetObject("ImageList1.ImageStream"), System.Windows.Forms.ImageListStreamer)
42 Me.ImageList1.TransparentColor = System.Drawing.Color.Transparent
43 Me.ImageList1.Images.SetKeyName(0, "bmp00002.bmp")
44 Me.ImageList1.Images.SetKeyName(1, "")
45 Me.ImageList1.Images.SetKeyName(2, "")
46 Me.ImageList1.Images.SetKeyName(3, "")
47 Me.ImageList1.Images.SetKeyName(4, "")
48 Me.ImageList1.Images.SetKeyName(5, "")
49 Me.ImageList1.Images.SetKeyName(6, "")
50 Me.ImageList1.Images.SetKeyName(7, "")
51 Me.ImageList1.Images.SetKeyName(8, "")
52 Me.ImageList1.Images.SetKeyName(9, "")
53 Me.ImageList1.Images.SetKeyName(10, "")
54 Me.ImageList1.Images.SetKeyName(11, "")
55 Me.ImageList1.Images.SetKeyName(12, "")
56 Me.ImageList1.Images.SetKeyName(13, "")
57 Me.ImageList1.Images.SetKeyName(14, "")
58 '
59 'ListView1
60 '
61 Me.ListView1.Dock = System.Windows.Forms.DockStyle.Fill
62 Me.ListView1.HideSelection = False
63 Me.ListView1.LargeImageList = Me.ImageList1
64 Me.ListView1.Location = New System.Drawing.Point(0, 25)
65 Me.ListView1.Name = "ListView1"
66 Me.ListView1.Size = New System.Drawing.Size(763, 544)
67 Me.ListView1.SmallImageList = Me.ImageList1
68 Me.ListView1.TabIndex = 3
69 Me.ListView1.UseCompatibleStateImageBehavior = False
70 Me.ListView1.View = System.Windows.Forms.View.SmallIcon
71 '
72 'OpenFileDialog1
73 '
74 Me.OpenFileDialog1.FileName = "OpenFileDialog1"
75 '
76 'MenuStrip1
77 '
78 Me.MenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.FleToolStripMenuItem})
79 Me.MenuStrip1.Location = New System.Drawing.Point(0, 0)
80 Me.MenuStrip1.Name = "MenuStrip1"
81 Me.MenuStrip1.Size = New System.Drawing.Size(763, 25)
82 Me.MenuStrip1.TabIndex = 4
83 Me.MenuStrip1.Text = "MenuStrip1"
84 '
85 'FleToolStripMenuItem
86 '
87 Me.FleToolStripMenuItem.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuFileOpen, Me.mnuFileExport, Me.mnuFileExit})
88 Me.FleToolStripMenuItem.Name = "FleToolStripMenuItem"
89 Me.FleToolStripMenuItem.Size = New System.Drawing.Size(36, 21)
90 Me.FleToolStripMenuItem.Text = "&Fle"
91 '
92 'mnuFileOpen
93 '
94 Me.mnuFileOpen.Name = "mnuFileOpen"
95 Me.mnuFileOpen.Size = New System.Drawing.Size(180, 22)
96 Me.mnuFileOpen.Text = "&Open"
97 '
98 'mnuFileExport
99 '
100 Me.mnuFileExport.Name = "mnuFileExport"
101 Me.mnuFileExport.Size = New System.Drawing.Size(180, 22)
102 Me.mnuFileExport.Text = "&Export..."
103 '
104 'mnuFileExit
105 '
106 Me.mnuFileExit.Name = "mnuFileExit"
107 Me.mnuFileExit.Size = New System.Drawing.Size(180, 22)
108 Me.mnuFileExit.Text = "e&Xit"
109 '
110 'frmMain
111 '
112 Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
113 Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
114 Me.ClientSize = New System.Drawing.Size(763, 569)
115 Me.Controls.Add(Me.ListView1)
116 Me.Controls.Add(Me.MenuStrip1)
117 Me.MainMenuStrip = Me.MenuStrip1
118 Me.MaximizeBox = False
119 Me.MinimizeBox = False
120 Me.Name = "frmMain"
121 Me.Text = "Export Images From ImageList"
122 Me.MenuStrip1.ResumeLayout(False)
123 Me.MenuStrip1.PerformLayout()
124 Me.ResumeLayout(False)
125 Me.PerformLayout()
126
127 End Sub
128
129 Friend WithEvents ImageList1 As ImageList
130 Friend WithEvents ListView1 As ListView
131 Friend WithEvents OpenFileDialog1 As OpenFileDialog
132 Friend WithEvents MenuStrip1 As MenuStrip
133 Friend WithEvents FleToolStripMenuItem As ToolStripMenuItem
134 Friend WithEvents mnuFileOpen As ToolStripMenuItem
135 Friend WithEvents mnuFileExport As ToolStripMenuItem
136 Friend WithEvents mnuFileExit As ToolStripMenuItem
137 Friend WithEvents FolderBrowserDialog1 As FolderBrowserDialog
138 End Class

程序代码:

 1 Imports System.Resources
2 Imports Microsoft.VisualBasic.CompilerServices
3 Public Class frmMain
4 Private Sub mnuFileOpen_Click(sender As Object, e As EventArgs) Handles mnuFileOpen.Click
5 Me.OpenFileDialog1 = New OpenFileDialog
6 Me.OpenFileDialog1.DefaultExt = "resx"
7 Me.OpenFileDialog1.AddExtension = True
8 Me.OpenFileDialog1.Filter = ("Microsoft.Net managed Resource File") + " (*.resx)|*.resx"
9 Me.OpenFileDialog1.FilterIndex = 1
10 If Me.OpenFileDialog1.ShowDialog() = DialogResult.OK AndAlso Operators.CompareString(Me.OpenFileDialog1.FileName, "", False) <> 0 Then
11 filename = Me.OpenFileDialog1.FileName
12 mnuFileExport.Enabled = True
13 Dim rsxr As ResXResourceReader = New ResXResourceReader(filename)
14 Dim resxSet As New ResXResourceSet(filename)
15 Dim d As DictionaryEntry
16 Dim n As Integer = 0
17 For Each d In rsxr
18 If Operators.CompareString(d.Value.ToString(), "System.Drawing.Bitmap", False) = 0 Then
19 Console.WriteLine(d.Key.ToString() + ":" + ControlChars.Tab + "'" + d.Value.ToString() + "'")
20 Dim image As Bitmap = CType(resxSet.GetObject(d.Key.ToString(), True), Bitmap)
21 If image IsNot Nothing Then
22 ImageList1.Images.Add(image)
23 ListView1.Items.Add(New ListViewItem(n.ToString(), n))
24 n += 1
25 End If
26 End If
27 Next d
28 rsxr.Close()
29 End If
30 End Sub
31 Private filename As String = ""
32 Private Sub mnuFileExport_Click(sender As Object, e As EventArgs) Handles mnuFileExport.Click
33 If Operators.CompareString(filename, "", False) <> 0 Then
34 Me.FolderBrowserDialog1.SelectedPath = "C:\"
35 Me.FolderBrowserDialog1.Description = "选择保存图标的目录"
36 If Me.FolderBrowserDialog1.ShowDialog() = DialogResult.OK AndAlso Operators.CompareString(Me.FolderBrowserDialog1.SelectedPath, "", False) <> 0 Then
37 Dim rsxr As ResXResourceReader = New ResXResourceReader(filename)
38 Dim resxSet As New ResXResourceSet(filename)
39 Dim d As DictionaryEntry
40 For Each d In rsxr
41 If Operators.CompareString(d.Value.ToString(), "System.Drawing.Bitmap", False) = 0 Then
42 Console.WriteLine(d.Key.ToString() + ":" + ControlChars.Tab + "'" + d.Value.ToString() + "'")
43 Dim image As Bitmap = CType(resxSet.GetObject(d.Key.ToString(), True), Bitmap)
44 If image IsNot Nothing Then
45 image.Save(Me.FolderBrowserDialog1.SelectedPath + "\" + d.Key.ToString() + ".bmp")
46 End If
47 End If
48 Next d
49 rsxr.Close()
50 End If
51 End If
52 End Sub
53 Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
54 mnuFileExport.Enabled = (Operators.CompareString(filename, "", False) <> 0)
55 End Sub
56 End Class

程序运行后,通过File-Open加载resx资源文件,图标将列在ListView控件中,界面如下:

通过File——Export...选择目标目录,将图标导出到指定目录。

关于VS.Net应用的图标提取方法的更多相关文章

  1. [EasyUI美化换肤]更换EasyUi图标

    前言 本篇文章主要是记录一些换EasyUI皮肤的过程,备忘.也欢迎美工大神各路UI给点好意见,EasyUI我就不介绍了,自行百度吧..(So..所以别问我是不是响应式..本身EasyUI就不是响应式. ...

  2. [转载]网站地址栏小图标favicon.ico的制作方法

    有人也许会好奇,有的网址前面有个漂亮的小图标而且有的网站图标还会动,这是怎么做到的呢? 如下图所示: 那个小图标有个名字叫favicon.ico,网站图标虽小但可以起到很好的点缀作用,尤其是当浏览者将 ...

  3. Xamarin Android 应用程序内图标上数字提示

    最近在用 Xamarin 做一个 Android 应用,打开应用时,如果有新消息,需要在应用内的 Toolbar 或者首页的图标上显示数字提示.在这里和大家分享一下实现方法,如果你有更新好的实现方法, ...

  4. 在Linux(Luna)下向Launch启动器中添加图标

    记录下在Luna下向Launch中添加图标的步骤,以供以后参考,这里我以加入eclipse图标为例: 首先,我们来创建一个desktop文件(Luna中到启动器Launch可以看作是Ubuntu中到桌 ...

  5. 一个标签的72变,打造一个纯CSS图标库

    每次要用到图标的时候都会到 icono 去copypaste,但每次用到的时候尺寸都各不一样,总是要调整参数,巨烦.当然你可以会想到用zoom.scale来做缩放,但是这样的缩放会使得线宽也变粗了,不 ...

  6. 自定义Sublime Text的图标

    sublime text很赞,windows上最接近mac逼格的轻量编辑器,对于我这样比较喜欢格调的人来说,简直不二之选啊. 美中不足的是,看久了觉得它的图标似乎不是很上心.现在都流行扁平化了而它还停 ...

  7. 【原】彻底解决WPS弹出热点广告、WPS购物图标的办法

    一直用WPS,但一直有一个问题迟迟没有解决,那就是讨厌的WPS广告问题! 每次开机都会自动在托盘上闪烁图标:“WPS购物”和“WPS热点”! 用自定义托盘图标隐藏都不管用,自动又会给改回来!这简直是流 ...

  8. Windows 10 安装SVN 不显示状态图标--解决方法

    升级win10以后,什么都正常,就是svn版本库图标不见了,图标的显示有助于我们定位代码的修改及提交情况,该怎么办呢? 下面分享详细的解决办法亲测有用: 其实也比较简单, 在注册表中找到此项: HKE ...

  9. 设置Debian8 光秃秃的桌面(图标,窗口样式等)

    在虚拟机里按抓了Debian8, 然后进入桌面后很不习惯,最主要是桌面光秃秃的, 今天终于不小心找到办法了: 按[Win]键, 找到"优化工具"程序; 或者是在右上角的[应用程序] ...

随机推荐

  1. 【linux】led子系统

    目录 前言 linux子系统 led子系统 led子系统实战-系统调用-ARM平台 前言 接下来记录的是 led子系统 目前不涉及驱动源码 linux子系统 在 Linux 系统中 绝大多数硬件设备都 ...

  2. 蒲公英 · JELLY技术周刊 Vol.30: 此路不通?Vue 3 新提案 Ref-sugar

    蒲公英 · JELLY技术周刊 Vol.30 随着 Vue 3 发布,相关的新闻也逐渐火热起来,而近期 RFC 中两个新的提案也因为某乎上的一些事情变得广为人关注.Ref sugar和script s ...

  3. 希捷powerchoice磁盘休眠功能配置方法

    本篇关于希捷磁盘休眠的配置方法 准备设置的软件 下载地址 https://raw.githubusercontent.com/Seagate/ToolBin/master/SeaChest/Power ...

  4. Cephfs的文件存到哪里了

    前言 在ceph里面使用rbd接口的时候,存储的数据在后台是以固定的prifix的对象存在的,这样就能根据相同的前缀对象去对image文件进行拼接或者修复 在文件系统里面这一块就要复杂一些,本篇就写的 ...

  5. Angular 之装饰器@Input

    Input 一个装饰器,用来把某个类字段标记为输入属性,并提供配置元数据. 该输入属性会绑定到模板中的某个 DOM 属性.当变更检测时,Angular 会自动使用这个 DOM 属性的值来更新此数据属性 ...

  6. 企业级工作流解决方案(九)--微服务Tcp消息传输模型之客户端处理

    客户端启动 客户端启动主要做三件事情,1. 从配置文件读取服务调用配置,存储到全局对象中.2. 指定客户端编解码器工厂.3. 预连接,即预先建立与服务端的通信Chanel. [DependsOn(ty ...

  7. 关于AOP思想,建议你看看这份五年开发总结的笔记,写的太详细了

    前言 OOP(Object Oriented Programing)面向对象编程 以对象为基本单位进行程序开发,通过对象间的彼此协同,相互协调,完成程序的构建 POP(Producer Oriente ...

  8. 新鲜出炉!阿里Java后端面经,已拿offer!

    前面给大家分享了一篇字节跳动拿下offer的面经,很多小伙伴都私信我说收获很大,感兴趣的朋友可以回头去看看.很多小伙伴还问我有没有其他大厂的面试题分享,这不他来啦,阿里2020春招面试题给大家整理在下 ...

  9. 什么是NTFS文件格式

    说到磁盘格式,想必大家对于NTFS格式并不陌生.我们使用的u盘等硬盘设备很多都应用了此格式.NTFS文件格式究竟是什么?它都有哪些特点?今天,小编将利用这篇文章为大家进行介绍. 一.什么是NTFS文件 ...

  10. C# redis集群批量操作之slot计算出16384个字符串

    引入一个大家都用的到的需求来说吧. 需求:要在三主三从的redis集群,存入数据,会对数据进行批量删除操作,数据要求要在redis集群负载均衡. 思路: 1.存入数据好办 1 var connect ...