基于答案中找到它我看到 - 这似乎相当微不足道,但不幸的是它并不那么简单。
让我们从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++项目程序。
这可以通过使用这样的预构建步骤walkarounded:
cd $(ProjectDir)
call "%VS100COMNTOOLS%\vsvars32.bat" >nul
rc /c 1252 /nologo myown.rc
如果您需要更改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更新我的方法工作正常 - 但是 - 在此程序集文件属性 - 版本信息消失后。可以使用典型的C++ .rc文件恢复它,但不幸的是,对于我来说,它会以某种方式破坏程序集属性 - 任务管理器会将你的exe显示为“应用程序”。如果可能以某种方式更改清单/应用程序标题 - 但没有任何结果,我试图进一步收获。之后,我最终也使用了这里提出的InsertIcons.exe解决方案。
所以,如果你不感兴趣的文件版本信息 - 你可以用我的解决方案,如果你需要的文件版本和任务管理器应正确显示您的应用程序 - 使用InsertIcons.exe。这里的C#代码snipet(SetIcon)将适用于任何解决方案。
问题解决。但我已经使用[ResEdit](http://www.resedit.net/)创建了rc/res文件。它可以完美运行 – 0xDEADBEEF 2012-01-18 22:37:39
或者只是将包含此类资源的本机DLL部署到应用程序中,因此您不必运行自定义工具或丢失版本信息。 – 2012-02-10 07:30:10
这种方法会丢失文件版本信息,并且如果您还原它(例如使用C++版本风格的.rc文件) - 您仍然会遇到任务管理器/应用程序标题不正确的问题。 (请参阅我自己的解决方案并在最后更新它。)因此,请使用InsertIcons.exe!不要使用官方的Microsoft工具! :-) – TarmoPikaro 2016-05-18 15:43:56