Основываясь на ответах, которые я вижу - это кажется довольно тривиальным, но, к сожалению, это не так просто.
Давайте начнем с файла .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
Где вам нужно изменить VS100COMNTOOLS в Visual Studio, с которойвы компилируете (я использую 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 # (SetIcon) здесь будет работать для вас в любом решении.