首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >向.NET添加多个图标(Win32-资源)-应用程序

向.NET添加多个图标(Win32-资源)-应用程序
EN

Stack Overflow用户
提问于 2012-01-18 23:46:11
回答 5查看 10.2K关注 0票数 18

可以在项目属性中设置应用程序图标。如果你这样做,exe将有这个图标,而不是默认的图标。该图标是一个win32资源,也可以像这样访问:

我想有我的程序使用的文件类型的特殊图标。要关联文件类型图标,我可以在注册表中指定它( "DefaultIcon“键中的”MyProg.exe,1“)。

那么,如何将更多的图标添加到程序集中,以便我可以将其用于文件类型关联?

非常感谢

ps:它是一个WPF应用程序(.NET 4.0)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-01-19 01:46:28

Windows不知道有关托管资源的任何内容,您需要将非托管资源添加到可执行文件中。在parapura的屏幕截图中,您需要选择Resource file单选按钮。这需要一个.res文件,这是一个通过对.rc文件运行Windows SDK rc.exe工具创建的二进制文件。.rc文件是一个简单的文本文件,其中包含资源语句,如下所示:

代码语言:javascript
复制
1 ICON "mainicon.ico"
2 ICON "alternative1.ico"
3 ICON "alternative2.ico"
1 24 "app.manifest"

确保不使用utf-8编码将此文件保存到您的项目文件夹中,最好使用记事本。使用项目+添加新项,应用程序清单文件创建所需的app.manifest文件。使用“项目+添加现有项”将此.rc文件添加到项目中。双击它并验证您是否可以看到图标和清单。右键单击顶部节点,添加资源,然后单击版本+新建。编辑版本信息,注意它将不再自动与AssemblyInfo.cs中的属性匹配

您可以使用Visual Studio命令提示符将.rc文件编译为.res文件:

代码语言:javascript
复制
rc /r something.rc

这将生成可在项目属性选项卡中使用的.res文件。这是一个预先构建的事件,这是可取的,但很难做到正确。出错的方式有很多,祝你好运。

票数 16
EN

Stack Overflow用户

发布于 2012-02-10 15:25:10

我刚刚创建了一个简单的工具来完成这项工作,而不必处理.res文件。它是一个很小的工具,你可以将它作为Post-Build事件的一部分使用,并允许你将特定文件夹中的所有图标文件添加到你的程序集中。如果我们假设您的主项目文件夹下有一个icons文件夹,您可以添加以下构建后事件:

代码语言:javascript
复制
C:\path\to\InsertIcons.exe $(TargetPath) $(ProjectDir)icons

更多的描述和下载可以在http://einaregilsson.com/add-multiple-icons-to-a-dotnet-application/上找到。

票数 13
EN

Stack Overflow用户

发布于 2016-04-15 18:19:38

根据我所看到的答案,这似乎很微不足道,但不幸的是,它并不是那么简单。

让我们从.rc文件开始-您可以像这样快速编写文件: myown.rc:

代码语言:javascript
复制
1 ICON "..\\Folder1\\icon1.ico"
2 ICON "..\\folder2\\icon2.ico"
1 24 "myown.manifest"

但下一个问题-从哪里获得你的应用程序所需的清单文件。

可以使用如下命令行提取当前使用的清单文件:

代码语言:javascript
复制
mt -inputresource:myOwnNetExe.exe;#1 -out:myown.manifest

然后,您可以在.net可执行文件中使用该清单。

但这还不是全部。从项目本身不能指定.res文件的相对路径,只能使用绝对路径。保存.csproj,并使用记事本手动编辑它-使路径成为相对路径。在那之后,项目编译就很好了。

但是在svn / git中,你可能不会把.res文件的源代码放进去。需要将.rc编译为.res。

最好在项目/预构建步骤中完成。

但rc.exe当然不能启动,因为它是C++项目,而我们的C#项目并不关心C++项目路径。

这可以像下面这样使用预编译步骤来完成:

代码语言:javascript
复制
cd $(ProjectDir)
call "%VS100COMNTOOLS%\vsvars32.bat" >nul
rc /c 1252 /nologo myown.rc

你需要用你正在编译的visual studio来改变VS100COMNTOOLS (我使用的是Visual studio 2010)。

但这还不是全部。如果你想在运行时改变你的应用程序的图标,你可能会对下面这样的代码片段感兴趣:

代码语言:javascript
复制
[DllImport("shell32.dll")]
public static extern IntPtr ExtractIcon(IntPtr hInst, string file, int nIconIndex);

[DllImport("user32.dll", SetLastError = true)]
static extern bool DestroyIcon(IntPtr hIcon);

/// <summary>
/// Sets icon from .exe or .dll into form object
/// </summary>
/// <param name="iIconIndex">Icon index to use.</param>
/// <param name="form">Form to assign to given icon</param>
/// <returns>true if ok, false if failed.</returns>
bool SetIcon( object form, int iIconIndex, String dllOrExe = null )
{
    if( dllOrExe == null )
        dllOrExe = System.Reflection.Assembly.GetExecutingAssembly().Location;

    IntPtr hIcon = ExtractIcon(IntPtr.Zero, dllOrExe, iIconIndex);

    if( hIcon == IntPtr.Zero )
        return false;

    Icon icon = (Icon) Icon.FromHandle(hIcon).Clone();
    DestroyIcon(hIcon);

    form.GetType().GetProperty("Icon").SetValue(form, icon);
    return true;
}

在form_load中,您可以像这样发出呼叫:

代码语言:javascript
复制
SetIcon(this, N);

其中N=0表示第一个图标,N=1-表示第二个图标,依此类推。

18.5.2016 Update My approach工作正常-但是-在此程序集文件属性-版本信息消失后。可以使用典型的C++ .rc文件将其恢复,但不幸的是,对我来说,它会以某种方式破坏汇编属性-任务管理器会将您的可执行文件显示为“应用程序”。如果有可能以某种方式改变清单/应用程序标题,我已经尝试了更深一层的收获--但没有任何结果。在那之后,我最终也使用了这里提出的InsertIcons.exe解决方案。

因此,如果你对文件版本信息不感兴趣-如果你需要文件版本和任务管理器应该正确显示你的应用程序-你可以使用我的解决方案-使用InsertIcons.exe。这里的C#代码片段(SetIcon)将在任何解决方案中为您工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8913018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档