Как задать програмно иконку бинарнику?

126
28 июля 2019, 23:10

Я создаю бинарник:

BinaryFormatter binary = new BinaryFormatter();
using (var fs = new FileStream($"{FileName}.item", FileMode.OpenOrCreate))
{
    binary.Serialize(fs, myItem);
    MessageBox.Show("Succes!");
}

Как при создании этого бинарника мне задавать ему иконку?

Answer 1

В Windows можно установить иконку для всех файлов определенного расширения, создав ключи в реестре:

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Win32;
using System.Runtime.InteropServices;
namespace ConsoleTest
{    
    class Program
    {
        const uint SHCNE_ASSOCCHANGED = 0x08000000;
        const uint SHCNF_IDLIST = 0x0000;
        [DllImport("shell32.dll")]
        static extern void SHChangeNotify(uint wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);
        public static void SetIcon(string ext, string iconpath, string typename, string typedescr)
        {
            RegistryKey key;
            //связываем расширение с типом
            key = Registry.ClassesRoot.CreateSubKey(ext);
            using (key)
            {
                key.SetValue("", typename);
            }
            //задаем параметры для типа
            key = Registry.ClassesRoot.CreateSubKey(typename);
            using (key)
            {
                key.SetValue("", typedescr);
                RegistryKey subkey=key.CreateSubKey("DefaultIcon");
                using (subkey)
                {
                    subkey.SetValue("", iconpath);
                }
            }
            //обновляем кэш иконок проводника
            SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero);
        }
        static void Main(string[] args)
        {
            SetIcon(".item", "C:\\Program Files (x86)\\MyApp\\item.ico","binitem","Binary file");            
            Console.ReadKey();
        }
    }
}

Файл иконки должен находиться либо в папке Windows, либо в папке Program Files на том же разделе, что и Windows. Если файл лежит в других папках, может не сработать. Изменить иконки на уровне отдельных файлов можно только путем создания своего расширения для проводника.

Источник: How to Assign a Custom Icon to a File Type

READ ALSO
Сортировка всех столбцов по убыванию DataGridView

Сортировка всех столбцов по убыванию DataGridView

Таблица заполняется рандомные цифрами и по нажатии на кнопку все столбцы должны быть отсортированы по убываниюПопробовал написать вот такой...

166
C# Application.Current.Dispatcher == null

C# Application.Current.Dispatcher == null

Пытаюсь обновить UI из другого потока, все вроде работает, но иногда ApplicationCurrent

123