本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
关于VS.Net应用的图标提取方法
我是陈晓 · 606浏览 · 发布于2020-12-10 +关注

.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格式文件的图标提取工具,本工具的具体代码如下:

界面设计代码:

 _
Partial Class frmMain
    Inherits System.Windows.Forms.Form

    'Form 重写 Dispose,以清理组件列表。
     _
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub

    'Windows 窗体设计器所必需的
    Private components As System.ComponentModel.IContainer

    '注意: 以下过程是 Windows 窗体设计器所必需的
    '可以使用 Windows 窗体设计器修改它。
    '不要使用代码编辑器修改它。
     _
    Private Sub InitializeComponent()
        Me.components = New System.ComponentModel.Container()
        Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmMain))
        Me.ImageList1 = New System.Windows.Forms.ImageList(Me.components)
        Me.ListView1 = New System.Windows.Forms.ListView()
        Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog()
        Me.MenuStrip1 = New System.Windows.Forms.MenuStrip()
        Me.FleToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
        Me.mnuFileOpen = New System.Windows.Forms.ToolStripMenuItem()
        Me.mnuFileExport = New System.Windows.Forms.ToolStripMenuItem()
        Me.mnuFileExit = New System.Windows.Forms.ToolStripMenuItem()
        Me.FolderBrowserDialog1 = New System.Windows.Forms.FolderBrowserDialog()
        Me.MenuStrip1.SuspendLayout()
        Me.SuspendLayout()
        '
        'ImageList1
        '
        Me.ImageList1.ImageStream = CType(resources.GetObject("ImageList1.ImageStream"), System.Windows.Forms.ImageListStreamer)
        Me.ImageList1.TransparentColor = System.Drawing.Color.Transparent
        Me.ImageList1.Images.SetKeyName(0, "bmp00002.bmp")
        Me.ImageList1.Images.SetKeyName(1, "")
        Me.ImageList1.Images.SetKeyName(2, "")
        Me.ImageList1.Images.SetKeyName(3, "")
        Me.ImageList1.Images.SetKeyName(4, "")
        Me.ImageList1.Images.SetKeyName(5, "")
        Me.ImageList1.Images.SetKeyName(6, "")
        Me.ImageList1.Images.SetKeyName(7, "")
        Me.ImageList1.Images.SetKeyName(8, "")
        Me.ImageList1.Images.SetKeyName(9, "")
        Me.ImageList1.Images.SetKeyName(10, "")
        Me.ImageList1.Images.SetKeyName(11, "")
        Me.ImageList1.Images.SetKeyName(12, "")
        Me.ImageList1.Images.SetKeyName(13, "")
        Me.ImageList1.Images.SetKeyName(14, "")
        '
        'ListView1
        '
        Me.ListView1.Dock = System.Windows.Forms.DockStyle.Fill
        Me.ListView1.HideSelection = False
        Me.ListView1.LargeImageList = Me.ImageList1
        Me.ListView1.Location = New System.Drawing.Point(0, 25)
        Me.ListView1.Name = "ListView1"
        Me.ListView1.Size = New System.Drawing.Size(763, 544)
        Me.ListView1.SmallImageList = Me.ImageList1
        Me.ListView1.TabIndex = 3
        Me.ListView1.UseCompatibleStateImageBehavior = False
        Me.ListView1.View = System.Windows.Forms.View.SmallIcon
        '
        'OpenFileDialog1
        '
        Me.OpenFileDialog1.FileName = "OpenFileDialog1"
        '
        'MenuStrip1
        '
        Me.MenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.FleToolStripMenuItem})
        Me.MenuStrip1.Location = New System.Drawing.Point(0, 0)
        Me.MenuStrip1.Name = "MenuStrip1"
        Me.MenuStrip1.Size = New System.Drawing.Size(763, 25)
        Me.MenuStrip1.TabIndex = 4
        Me.MenuStrip1.Text = "MenuStrip1"
        '
        'FleToolStripMenuItem
        '
        Me.FleToolStripMenuItem.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuFileOpen, Me.mnuFileExport, Me.mnuFileExit})
        Me.FleToolStripMenuItem.Name = "FleToolStripMenuItem"
        Me.FleToolStripMenuItem.Size = New System.Drawing.Size(36, 21)
        Me.FleToolStripMenuItem.Text = "&Fle"
        '
        'mnuFileOpen
        '
        Me.mnuFileOpen.Name = "mnuFileOpen"
        Me.mnuFileOpen.Size = New System.Drawing.Size(180, 22)
        Me.mnuFileOpen.Text = "&Open"
        '
        'mnuFileExport
        '
        Me.mnuFileExport.Name = "mnuFileExport"
        Me.mnuFileExport.Size = New System.Drawing.Size(180, 22)
        Me.mnuFileExport.Text = "&Export..."
        '
        'mnuFileExit
        '
        Me.mnuFileExit.Name = "mnuFileExit"
        Me.mnuFileExit.Size = New System.Drawing.Size(180, 22)
        Me.mnuFileExit.Text = "e&Xit"
        '
        'frmMain
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(763, 569)
        Me.Controls.Add(Me.ListView1)
        Me.Controls.Add(Me.MenuStrip1)
        Me.MainMenuStrip = Me.MenuStrip1
        Me.MaximizeBox = False
        Me.MinimizeBox = False
        Me.Name = "frmMain"
        Me.Text = "Export Images From ImageList"
        Me.MenuStrip1.ResumeLayout(False)
        Me.MenuStrip1.PerformLayout()
        Me.ResumeLayout(False)
        Me.PerformLayout()

    End Sub

    Friend WithEvents ImageList1 As ImageList
    Friend WithEvents ListView1 As ListView
    Friend WithEvents OpenFileDialog1 As OpenFileDialog
    Friend WithEvents MenuStrip1 As MenuStrip
    Friend WithEvents FleToolStripMenuItem As ToolStripMenuItem
    Friend WithEvents mnuFileOpen As ToolStripMenuItem
    Friend WithEvents mnuFileExport As ToolStripMenuItem
    Friend WithEvents mnuFileExit As ToolStripMenuItem
    Friend WithEvents FolderBrowserDialog1 As FolderBrowserDialog
End Class

    程序代码:

Imports System.Resources
Imports Microsoft.VisualBasic.CompilerServices
Public Class frmMain
    Private Sub mnuFileOpen_Click(sender As Object, e As EventArgs) Handles mnuFileOpen.Click
        Me.OpenFileDialog1 = New OpenFileDialog
        Me.OpenFileDialog1.DefaultExt = "resx"
        Me.OpenFileDialog1.AddExtension = True
        Me.OpenFileDialog1.Filter = ("Microsoft.Net managed Resource File") + " (*.resx)|*.resx"
        Me.OpenFileDialog1.FilterIndex = 1
        If Me.OpenFileDialog1.ShowDialog() = DialogResult.OK AndAlso Operators.CompareString(Me.OpenFileDialog1.FileName, "", False) <> 0 Then
            filename = Me.OpenFileDialog1.FileName
            mnuFileExport.Enabled = True
            Dim rsxr As ResXResourceReader = New ResXResourceReader(filename)
            Dim resxSet As New ResXResourceSet(filename)
            Dim d As DictionaryEntry
            Dim n As Integer = 0
            For Each d In rsxr
                If Operators.CompareString(d.Value.ToString(), "System.Drawing.Bitmap", False) = 0 Then
                    Console.WriteLine(d.Key.ToString() + ":" + ControlChars.Tab + "'" + d.Value.ToString() + "'")
                    Dim image As Bitmap = CType(resxSet.GetObject(d.Key.ToString(), True), Bitmap)
                    If image IsNot Nothing Then
                        ImageList1.Images.Add(image)
                        ListView1.Items.Add(New ListViewItem(n.ToString(), n))
                        n += 1
                    End If
                End If
            Next d
            rsxr.Close()
        End If
    End Sub
    Private filename As String = ""
    Private Sub mnuFileExport_Click(sender As Object, e As EventArgs) Handles mnuFileExport.Click
        If Operators.CompareString(filename, "", False) <> 0 Then
            Me.FolderBrowserDialog1.SelectedPath = "C:\"
            Me.FolderBrowserDialog1.Description = "选择保存图标的目录"
            If Me.FolderBrowserDialog1.ShowDialog() = DialogResult.OK AndAlso Operators.CompareString(Me.FolderBrowserDialog1.SelectedPath, "", False) <> 0 Then
                Dim rsxr As ResXResourceReader = New ResXResourceReader(filename)
                Dim resxSet As New ResXResourceSet(filename)
                Dim d As DictionaryEntry
                For Each d In rsxr
                    If Operators.CompareString(d.Value.ToString(), "System.Drawing.Bitmap", False) = 0 Then
                        Console.WriteLine(d.Key.ToString() + ":" + ControlChars.Tab + "'" + d.Value.ToString() + "'")
                        Dim image As Bitmap = CType(resxSet.GetObject(d.Key.ToString(), True), Bitmap)
                        If image IsNot Nothing Then
                            image.Save(Me.FolderBrowserDialog1.SelectedPath + "\" + d.Key.ToString() + ".bmp")
                        End If
                    End If
                Next d
                rsxr.Close()
            End If
        End If
    End Sub
    Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        mnuFileExport.Enabled = (Operators.CompareString(filename, "", False) <> 0)
    End Sub
End Class

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

 

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

另外,针对System.Drawing.Icon、ImageList的ImageStream也可以进行相应处理,代码如下:

If Operators.CompareString(d.Value.ToString(), "System.Drawing.Icon", False) = 0 Then
                    Dim image As Icon = CType(resxSet.GetObject(d.Key.ToString(), True), Icon)
                    If image IsNot Nothing Then
                        ImageList1.Images.Add(image)
                        ListView1.Items.Add(New ListViewItem(n.ToString(), n))
                        n += 1
                    End If
                End If
                If Operators.CompareString(d.Key.ToString(), "ImageList1.ImageStream", False) = 0 Then
                    imgList.ImageStream = CType(resxSet.GetObject(d.Key.ToString(), True), System.Windows.Forms.ImageListStreamer)
                    For i As Integer = 0 To imgList.Images.Count - 1
                        ImageList1.Images.Add(imgList.Images(i))
                        ListView1.Items.Add(New ListViewItem(n.ToString(), n))
                        n += 1
                    Next
                End If

其中,可以输入ImageList控件名称,来选择具体解析对象。

相关推荐

PHP实现部分字符隐藏

沙雕mars · 1312浏览 · 2019-04-28 09:47:56
Java中ArrayList和LinkedList区别

kenrry1992 · 896浏览 · 2019-05-08 21:14:54
Tomcat 下载及安装配置

manongba · 957浏览 · 2019-05-13 21:03:56
JAVA变量介绍

manongba · 953浏览 · 2019-05-13 21:05:52
什么是SpringBoot

iamitnan · 1077浏览 · 2019-05-14 22:20:36
加载中

0评论

评论
我是一名在上海一家互联网公司上班,专注技术开发工作等。
小鸟云服务器
扫码进入手机网页