关于VS.Net应用的图标提取方法
2020-12-09 22:38
826 查看
.Net的资源文件
VS.Net 支持三种文件类型的resource:.txt、.resx、.resources。
system.resources 名字空间支持三种资源文件:
- [li]txt 文件,只能有字符串资源。因为不能被嵌入到 assembly 中,所以非常容易暴露,被客户修改。最大缺点是仅支持字符串资源,所以不推荐使用。
- .resx 文件,由 xml 组成,能加入所有资源,包括二进制。同样不能被嵌入到 assembly 中。在 system.resources 名字空间中有专用读写的类。vs.net 创建这种文件然后将其转成 .resources 文件并根据设置将其嵌入到 assembly 中。
- .resources 文件,pe 格式,能加入所有资源。唯一能被嵌入到 assembly 的文件,在 system.resources 名字空间中有专用读写的类。
- 把resx文件通过vs加入到.net工程中后,编译完成时,它会被转化为resources文件并embed到assembly中。
- System.resources.resourceManager负责读取.net assembly中嵌入的resources文件中的资源信息。
- 三种文件类型,必须要转为resources文件,才能被resourcemanager读取(显然的)。ResGen.exe主要完成此项工作。
- C++/CLI, vb.net, c#,大家都可以用resx文件是自然的。只不过在Vs里添加resx文件时,c#工程要支持的更完备些:直接替你封装好了对resourcemanager的使用。
- 推荐工具
- [li]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.W 1044 indows.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 ToolStripMen 56c uItem 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 ClassView Code
& ad8 nbsp; 程序代码:
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 < 56c span style="color: rgba(0, 0, 255, 1)">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 ClassView Code
程序运行后,通过File-Open加载resx资源文件,图标将列在ListView控件中,界面如下:
通过File——Export...选择目标目录,将图标导出到指定目录。
相关文章推荐
- 关于Android App上线后从应用市场点击打开按钮进入应用后进行操作后,再点击home键到桌面后点击启动图标重新打开应用的解决方法
- 关于MSPlus控件下载后用VS.NET打开提示目录不对的解决方法
- 关于VS.NET 2005中文版项目文件丢失的解决方法
- 关于VS.NET 2005中文版项目模版文件丢失的解决方法,如WWF
- .NET:关于byte数组在用StreamWriter文件写出后出现多余字符的解决方法及VS方案文件图标显示问题
- 关于vs.net 2003向vs.net 2005迁移后,注册事件丢失,"并不包含...的定义" 的解决方法
- 关于如何在VS+Qt集成环境中设置应用程序图标的简单方法
- 关于VS.NET 2005中文版项目模版文件丢失的解决方法,如WWF
- 关于用vs2017 应用ado.net技术创建项目(解决方案)的方法
- 01-asp.net 系列关于vs 2005 主题的示例。 我打包了文件。 做好主题后,有3种方法。
- 关于vs.net 2005 的日记2
- QTP关于验证码的应用解决方法之一
- 一个关于在VB.NET中应用超级解霸的问题
- 《TVS2.0应用实录》005:Together for VS.NET 2.0 Bugs及解决方法(part 1)
- [求助]关于Vsiual Studio.NET 2005中Error List种错误的定位问题
- 简单ASP.NET AJAX 客户端应用:用JS直接调用WebServices方法
- 在VS.NET 2003中建立项目时遇到的两个问题及解决方法 (转贴)
- 关于ASP.net服务器的入侵方法(1)
- 关于Asp.net的FormView控件中,用FindControl方法找不到对应控件问题
- 安装VS.NET 2003 和 SQL Server 2000 的问题及解决方法