Добавление нескольких иконок (Win32-Resource) в .NET-приложение
можно установить значок приложения в свойствах проекта. Если вы сделаете это, exe будет иметь этот значок вместо стандартного. этот значок является ресурсом win32, и его также можно получить следующим образом:
![change icon]()
Я хочу иметь специальные значки для типов файлов, которые используются моей программой. для сопоставления значка filetype я могу указать его в реестре ( "MyProg.exe, 1" в ключе "DefaultIcon" ).
так , как добавить ADO MORE в сборку, которую я могу использовать для ассоциации filetype?
Большое спасибо
ps: это WPF-приложение (.NET 4.0)
Ответы
Ответ 1
Windows ничего не знает о управляемых ресурсах, вам нужно добавить неуправляемые ресурсы в ваш исполняемый файл. В скриншоте парапуры вам нужно выбрать переключатель Resource file
. Для этого требуется файл .res, двоичный файл, созданный при запуске утилиты Windows SDK rc.exe в файле .rc. Файл .rc представляет собой простой текстовый файл, содержащий операторы ресурсов, аналогичные этому:
1 ICON "mainicon.ico"
2 ICON "alternative1.ico"
3 ICON "alternative2.ico"
1 24 "app.manifest"
Обязательно сохраните этот файл в папке проекта без кодировки utf-8, лучше всего используйте Notepad. Создайте необходимый файл app.manifest с помощью Project + Add New Item, Application Manifest File. Добавьте этот .rc файл в свой проект с помощью Project + Добавить существующий элемент. Дважды щелкните его и убедитесь, что вы видите значки и манифест. Щелкните правой кнопкой мыши верхний node, Добавить ресурс и нажмите "Версия + Создать". Измените информацию о версии, остерегайтесь того, что она больше не будет автоматически соответствовать атрибутам в AssemblyInfo.cs
Вы можете скомпилировать файл .rc в файл .res с приглашением командной строки Visual Studio:
rc /r something.rc
Создает файл .res, который вы можете использовать на вкладке свойств проекта. Выполнение этого предпроектного события целесообразно, но немного сложно получить право. Количество способов, которые могут пойти не так, многочисленны, удачи.
Ответ 2
Я только что создал простой инструмент, чтобы сделать это без необходимости связываться с файлами .res. Это небольшая утилита, которую вы можете использовать как часть своего события Post-Build и позволяет добавлять все файлы значков в определенную папку к вашей сборке. Если мы предположим, что у вас есть папка с иконками в основной папке проекта, вы можете добавить следующее событие после сборки:
C:\path\to\InsertIcons.exe $(TargetPath) $(ProjectDir)icons
Дальнейшее описание и загрузка можно найти на http://einaregilsson.com/add-multiple-icons-to-a-dotnet-application/
Ответ 3
Если вы перейдете к настройкам своего проекта, вы увидите способ установки значка для приложения.
![enter image description here]()
Чтобы добавить дополнительные значки...
- Кнопка правой кнопки мыши в проекте в обозревателе решений и выберите Новый элемент, а затем Файл ресурсов
- Дважды щелкните файл ресурсов в проводнике решений и выберите Добавить ресурс → Новый значок
Ответ 4
Основываясь на ответах, которые я вижу - это кажется довольно тривиальным, но, к сожалению, это не так просто.
Давайте начнем с .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 file - только исходный код.
Нужно скомпилировать .rc в .res.
Лучше всего сделать это на этапе проекта/предварительной сборки.
Но, конечно, rc.exe не может быть запущен, так как это проект на С++, и у нас есть проект С#, который не заботится о планах проекта С++.
Это можно обойти, используя шаг предварительной сборки следующим образом:
cd $(ProjectDir)
call "%VS100COMNTOOLS%\vsvars32.bat" >nul
rc /c 1252 /nologo myown.rc
Где вам нужно изменить VS100COMNTOOLS с визуальной студией, с которой вы компилируете (я использую Visual Studio 2010).
И это еще не все. Если вы хотите изменить значок своего приложения на лету - во время выполнения - вам может быть интересен код snipet следующим образом:
[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 Обновление Мой подход работает нормально - однако - после этого свойства файла сборки - информация о версии исчезает. Можно восстановить его с помощью типичного файла С++.rc, но, к сожалению, для меня он каким-то образом разбивает ассемблерные атрибуты - диспетчер задач отображает ваш exe как "приложение". Я попытался собрать бит глубже, если можно каким-то образом изменить название манифеста/приложения, но без какого-либо результата. После этого я решил использовать предложенное здесь решение InsertIcons.exe.
Итак, если вас не интересует информация о версии файла, вы можете использовать мое решение, если вам нужна версия файла, а диспетчер задач должен правильно показать ваше приложение - используйте InsertIcons.exe. Сценарий кода С# (SetIcon) здесь будет работать для вас в любом решении.
Ответ 5
Я успешно использовал метод InsertIcons, пока антивирус Symantec не стал помечать мой exe как подозрительный. Я предполагаю, что Symantec не понравилось изменение подписи, которое приходит с messing с exe в качестве этапа пост-сборки.
В итоге я пошел с отдельной библиотекой классов .NET dll, скомпилированной с использованием следующего кода в файле csproj:
<PropertyGroup>
<Win32Resource>icons.res</Win32Resource>
</PropertyGroup>
Вам не нужно устанавливать инструменты сборки С++, но вам нужен компилятор ресурсов, как описано в принятом ответе выше.
Мой файл icons.rc выглядит следующим образом:
1 ICON "IconA.ico"
2 ICON "IconB.ico"
3 ICON "IconC.ico"
И команда предварительной сборки:
"C:\Program Files (x86)\Windows Kits\8.1\bin\x86\rc.exe" $(ProjectDir)icons.rc