获取C# WinForms应用程序图标

20

我已经在C# WinForms应用程序中使用“项目属性”选项卡为其分配了一个图标。在构建时,此图标与程序清单一起提供。是否有一种方法可以在运行时获取此图标的System.Drawing.Icon对象,而无需再次嵌入资源?

我进行了研究; 有一种从exe文件中提取图标的方法,但我找不到任何方式从应用程序内部提取运行中的C#应用程序的图标。


重复的问题?https://dev59.com/eXVC5IYBdhLWcg3wtzqs - Wyatt Earp
1
不是重复的问题。我只是链接到一个类似的问题,其中包含相同的函数(Icon.ExtractAssociatedIcon),明确表示我不想这样做! - Robin Rodricks
图标被嵌入为非托管资源,以便Windows可以使用它。因此,您必须执行与Windows相同的操作才能获取它并使用pinvoke LoadImage()检索它。这很愚蠢,因为图标是小型资源,所以没有避免将其作为托管资源嵌入的必要。 - Hans Passant
2个回答

35

你看到链接中的第二个答案了吗?(如何在C#中仅有一个进程实例时获取可执行文件的图标)

//Gets the icon associated with the currently executing assembly
//(or pass a different file path and name for a different executable)
Icon appIcon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location);

这似乎是获取正在执行的程序集图标。


4
需要注意的是,如果执行程序集位于网络路径上,则此方法将抛出“System.ArgumentException”。MSDN提到了这一点,但我不知何故错过了这一部分。 - bokibeg
2
注意,AssemblySystem.Reflection 中。 - AaA
1
即使应用程序是从网络路径加载的,ExtractIconEx也可以完成工作。 - oleksa
3
如果您想使用应用程序可执行文件图标,您应该使用Assembly.GetEntryAssembly().Location。 - Majid

1
在这里,您可以获取表单本身的图标,以防您正在寻找它:
Bitmap temp = this.Icon.ToBitmap();
temp.Save("c:\\Users\\userName\\Downloads\\icon.png");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接