我如何包含一个可用于可执行文件和表单的图标?
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 与可执行文件一起发送,因此您仍然需要包含两次图标。以上是关于我如何包含一个可用于可执行文件和表单的图标?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 linux 系统的可执行文件上设置图标(或 .ico 文件)?
删除 Mac OS X 中 shell 可执行文件的停靠图标?