如何知道.dll文件包含多少个图标(通过从计算机导入文件)C#

How to know how many icons a .dll file contains (by importing the file from the computer) C#

我想知道是否可以通过从用户计算机导入文件来找出一个 .dll 文件存储了多少个图标。我会详细解释我想做什么。我需要知道 .dll 文件包含多少个图标,因为我正在使用 listview 它将放置此 .dll 文件包含的图标,因为当此表单启动时,它会向用户显示图标,列表视图中要显示的图标数量是我需要显示这些图标的数量。

我想做的是用户可以从他的计算机导入他自己的.dll 文件。我的程序可以读取 .dll 文件或图标。但我必须告诉它 .dll 文件的路径,当我添加一个 .dll 文件时,我使用一个程序,而不仅仅是任何程序,它是 GConvert 5。它非常适合从 .dll 文件中以任何格式保存图标但我用它来知道我打开的这个 .dll 文件中有多少个图标。在我知道这一点之后,我为每个图标添加一行代码(从 0 开始到(.dll 文件中的图标数量))。但是,当我不在用户计算机后面时,我怎么知道一个 .dll 文件包含多少个图标呢?我这样做了:

但我在 Google 上找不到任何解决方案,尝试了一些代码,但如果我使用 Whosebug,我的代码不起作用。

谢谢你的帮助!

我尝试使用循环在列表视图中显示图标,但它不起作用,我希望用户打开 .dll 文件,在列表视图中它只会显示其中的图标数量列表视图。

您可以使用 ExtractIconEx 函数获取图标和图标数量:

[DllImport("Shell32.dll")]
private static extern int ExtractIconEx(
    string lpszFile,
    int nIconIndex,
    IntPtr[] phiconLarge,
    IntPtr[] phiconSmall,
    int nIcons);

要获取文件中图标的数量,请传递nIconIndex= -1nIcons = 0,return 值将是图标的数量。稍后,使用您在上一步中收到的计数初始化所需的数组并传递 nIconIndex= 0nIcons = count of icons.

例子

这是一个非常简单的示例,展示了如何从 shell32.dll 获取图标并将它们显示在列表视图中:

[DllImport("shell32.dll")]
private static extern int ExtractIconEx(
    string lpszFile,
    int nIconIndex,
    IntPtr[] phiconLarge,
    IntPtr[] phiconSmall,
    int nIcons);

[DllImport("user32.dll")]
private static extern bool DestroyIcon(IntPtr hIcon);

private void Form1_Load(object sender, EventArgs e)
{
    var count = ExtractIconEx("shell32.dll",
        -1, null, null, 0);
    var phiconLarge = new IntPtr[count];
    var phiconSmall = new IntPtr[count];
    var result = ExtractIconEx("shell32.dll",
        0, phiconLarge, null, count);
    ImageList imagelist1 = new ImageList();
    imagelist1.ImageSize = SystemInformation.IconSize;
    imagelist1.Images.AddRange(
        phiconLarge.Select(x => Icon.FromHandle(x).ToBitmap()).ToArray());
    var listView1 = new ListView();
    listView1.LargeImageList = imagelist1;
    listView1.Dock = DockStyle.Fill;
    listView1.View = View.LargeIcon;
    listView1.Items.AddRange(
        Enumerable.Range(0, count)
        .Select(x => new ListViewItem(x.ToString(), x)).ToArray());
    this.Controls.Add(listView1);
    phiconLarge.ToList().ForEach(x => DestroyIcon(x));
}

这就是你得到的:

请注意 Jimi 根据 documentations 在评论中突出显示的要点,以在不需要时立即销毁图标句柄:当它们不再需要时需要,您必须通过调用 DestroyIcon 函数销毁 ExtractIconEx 提取的所有图标。