可以在项目属性中设置应用程序图标。如果你这样做,exe将有这个图标,而不是默认的图标。该图标是一个win32资源,也可以像这样访问:
我想有我的程序使用的文件类型的特殊图标。要关联文件类型图标,我可以在注册表中指定它( "DefaultIcon“键中的”MyProg.exe,1“)。
那么,如何将更多的图标添加到程序集中,以便我可以将其用于文件类型关联?
非常感谢
ps:它是一个WPF应用程序(.NET 4.0)
发布于 2012-01-19 01:46:28
Windows不知道有关托管资源的任何内容,您需要将非托管资源添加到可执行文件中。在parapura的屏幕截图中,您需要选择Resource file
单选按钮。这需要一个.res文件,这是一个通过对.rc文件运行Windows SDK rc.exe工具创建的二进制文件。.rc文件是一个简单的文本文件,其中包含资源语句,如下所示:
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文件:
rc /r something.rc
这将生成可在项目属性选项卡中使用的.res文件。这是一个预先构建的事件,这是可取的,但很难做到正确。出错的方式有很多,祝你好运。
发布于 2012-02-10 15:25:10
我刚刚创建了一个简单的工具来完成这项工作,而不必处理.res文件。它是一个很小的工具,你可以将它作为Post-Build事件的一部分使用,并允许你将特定文件夹中的所有图标文件添加到你的程序集中。如果我们假设您的主项目文件夹下有一个icons文件夹,您可以添加以下构建后事件:
C:\path\to\InsertIcons.exe $(TargetPath) $(ProjectDir)icons
更多的描述和下载可以在http://einaregilsson.com/add-multiple-icons-to-a-dotnet-application/上找到。
发布于 2016-04-15 18:19:38
根据我所看到的答案,这似乎很微不足道,但不幸的是,它并不是那么简单。
让我们从.rc文件开始-您可以像这样快速编写文件: myown.rc:
1 ICON "..\\Folder1\\icon1.ico"
2 ICON "..\\folder2\\icon2.ico"
1 24 "myown.manifest"
但下一个问题-从哪里获得你的应用程序所需的清单文件。
可以使用如下命令行提取当前使用的清单文件:
mt -inputresource:myOwnNetExe.exe;#1 -out:myown.manifest
然后,您可以在.net可执行文件中使用该清单。
但这还不是全部。从项目本身不能指定.res文件的相对路径,只能使用绝对路径。保存.csproj,并使用记事本手动编辑它-使路径成为相对路径。在那之后,项目编译就很好了。
但是在svn / git中,你可能不会把.res文件的源代码放进去。需要将.rc编译为.res。
最好在项目/预构建步骤中完成。
但rc.exe当然不能启动,因为它是C++项目,而我们的C#项目并不关心C++项目路径。
这可以像下面这样使用预编译步骤来完成:
cd $(ProjectDir)
call "%VS100COMNTOOLS%\vsvars32.bat" >nul
rc /c 1252 /nologo myown.rc
你需要用你正在编译的visual studio来改变VS100COMNTOOLS (我使用的是Visual studio 2010)。
但这还不是全部。如果你想在运行时改变你的应用程序的图标,你可能会对下面这样的代码片段感兴趣:
[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中,您可以像这样发出呼叫:
SetIcon(this, N);
其中N=0表示第一个图标,N=1-表示第二个图标,依此类推。
18.5.2016 Update My approach工作正常-但是-在此程序集文件属性-版本信息消失后。可以使用典型的C++ .rc文件将其恢复,但不幸的是,对我来说,它会以某种方式破坏汇编属性-任务管理器会将您的可执行文件显示为“应用程序”。如果有可能以某种方式改变清单/应用程序标题,我已经尝试了更深一层的收获--但没有任何结果。在那之后,我最终也使用了这里提出的InsertIcons.exe解决方案。
因此,如果你对文件版本信息不感兴趣-如果你需要文件版本和任务管理器应该正确显示你的应用程序-你可以使用我的解决方案-使用InsertIcons.exe。这里的C#代码片段(SetIcon)将在任何解决方案中为您工作。
https://stackoverflow.com/questions/8913018
复制相似问题