Большинство решений, которые я находил для получения иконки, ассоциированной с файлом, используют системные функции напрямую. Но есть и стандартные средства, с помощью которых это можно сделать наверное даже еще проще. А именно используя метод Icon.ExtractAssociatedIcon (https://msdn.microsoft.com/en-US/library/system.drawing.icon.extractassociatedicon.aspx)
Итак, небольшой и понятный код:
public class AssociatedIconService
{
const string SUB_FOLDER = "AssociatedIcon";
String tmpFolder = null;
Dictionary<String, Icon> extToIconDict = new Dictionary<string, Icon>(); // cache
public AssociatedIconService() {
tmpFolder = Path.Combine(CommonInfo.AppTempFolderPath, SUB_FOLDER);
}
public Icon GetAssociatedIconByFileName(string fileName) {
if (String.IsNullOrEmpty(fileName)) return null;
// define key (short filename with extension)
String shortFileName = "file";
String extens = Path.GetExtension(fileName);
if (String.IsNullOrEmpty(extens) == false)
shortFileName += extens;
if (extToIconDict.ContainsKey(shortFileName) == false) {
// crete empty file if not exists
String fullName = Path.Combine(tmpFolder, shortFileName);
if (Directory.Exists(tmpFolder) == false) { Directory.CreateDirectory(tmpFolder); }
if (File.Exists(fullName) == false) { File.Create(fullName).Dispose(); }
// extract icon into cache
extToIconDict[shortFileName] = Icon.ExtractAssociatedIcon(fullName);
}
return extToIconDict[shortFileName];
}
}