我如何包含一个可用于可执行文件和表单的图标?

Posted

技术标签:

【中文标题】我如何包含一个可用于可执行文件和表单的图标?【英文标题】:How do I include an icon once that can be used for both the executable and a form? 【发布时间】:2017-11-17 02:13:45 【问题描述】:

我正在尝试为应用程序可执行文件和应用程序内的表单使用单个 .ico 文件(具有多种大小),而不在可执行文件中包含两次图标。

我注意到这一点是因为我的应用程序(没有图标)编译为 600KB,而图标为 300KB,但是当我使用这两个应用程序时,编译后的应用程序增加到 1200KB,表明它被嵌入了两次。

这是我尝试过的:

(1) 使用 UI 选择图标文件

    转到应用程序属性>应用程序>资源>图标并使用“...”按钮选择MyIcon.ico文件。 编译后的 exe 现在是 900KB 转到表单属性> 图标并使用“...”按钮选择MyIcon.ico 文件。 编译后的 exe 现在为 1200KB

(2) 使用资源

    转到应用程序属性>资源>图标>添加现有文件并选择MyIcon.ico文件 在表单构造函数中,添加:this.Icon = Properties.Resources.MyIcon; 编译后的 exe 现在是 900KB 转到应用程序属性>应用程序>资源>图标,然后选择Resources\MyIcon.ico(在下拉列表中列出) 编译后的 exe 现在为 1200KB

显然,它仍然第二次包含该文件,而不是引用嵌入的资源。

(3) 使用 Icon.ExtractAssociatedIcon()

    转到应用程序属性>应用程序>资源>图标并使用“...”按钮选择MyIcon.ico文件。 编译后的 exe 现在是 900KB 在表单构造函数中,添加this.Icon = Icon.ExtractAssociatedIcon(AppDomain.CurrentDomain.FriendlyName); 编译后的 exe 仍为 900KB,但图标是 Windows 中的通用“exe”图标,而不是我的应用程序图标

在深入探讨之前,我是否遗漏了一些明显的东西?有没有标准的方法来做到这一点?我只是没有正确使用Icon.ExtractAssociatedIcon()吗?

【问题讨论】:

【参考方案1】:

对不起,这是我的疏忽。方法(3)确实有效。

我在 VisualStudio 调试器中运行它,但没有注意到 .vshost.exe 文件有一个不同的图标 -- 这就是表单中显示的图标。

直接使用编译好的exe,效果很好。

【讨论】:

【参考方案2】:

在项目中添加必要的图标后,您必须做两件事:

    选择表单并在“属性”中的“图标”属性中选择该图标。 转到项目的属性并在图标字段中选择相同的图标。

当您构建项目时,您会在各处看到必要的图标。

更新: 对不起,没有完整的答案,我们开始: 你是对的,它创建了两次,第一个是 ico 文件本身,第二个是 Form.resx 文件中的 base64 字符串,它是在第一步添加 ico 时生成的。那么,如何解决呢

首先进入InitializeComponent()方法,细化this.Icon字符串,改成如下

this.Icon = new Icon(Path.GetDirectoryName(Application.ExecutablePath) + "../../../[YOUR ICO FILE NAME].ico");

,然后删除自动生成的 Form.resx 文件。 此处的图标对象是 System.Drawing.Icon。例如,我设置的文件名,如您所见,它是 *.sln 文件旁边的 ico。在实际情况下,无需转到父文件夹。

【讨论】:

是的,这就是我在 (1) 中所做的,它包含了两次 ico,使 exe 的大小增加了一倍。这正是我想要避免的。 我添加了正确答案。但请考虑到,Designer 使用此解决方案会不稳定。它生成 base64 字符串到 *.resx 文件,让 Designer 正常工作。我认为您可以即时安装 Icon for Form,而不是在初始化组件期间。但是我这么多年没有使用 Windows 窗体,这就是为什么可能有其他一些好的方法来修复它。 即使使用这种方法,您仍然需要将 .ico 与可执行文件一起发送,因此您仍然需要包含两次图标。

以上是关于我如何包含一个可用于可执行文件和表单的图标?的主要内容,如果未能解决你的问题,请参考以下文章

如何向 mingw-gcc 编译的可执行文件添加图标?

如何在 linux 系统的可执行文件上设置图标(或 .ico 文件)?

如何删除 shell 可执行文件的停靠图标?

删除 Mac OS X 中 shell 可执行文件的停靠图标?

如何将图标添加到 Python pip 生成的可执行文件的 entry_points

如何以编程方式更改 Windows 可执行文件和 Mac 应用程序的图标?