#c# #.net #xml #shell #icons
#c# #.net #xml #оболочка #Значки
Вопрос:
У меня есть много видов xml-файлов (все с расширением .xml) с разными именами корневых элементов и пространствами имен. Я хочу связать каждый тип с другим приложением, а также сделать возможным использование разных значков файлов для каждого типа. Можно ли это сделать с помощью C # .NET?
Ответ №1:
Единственный способ справиться с этим — аналогично тому, который Visual Studio использует для обработки .sln
файлов, который является селектором версий Visual Studio. Именно это приложение связывается с .sln
файлами и обрабатывает предоставление значка и возможного процесса для обработки конкретного .sln
файла. Предполагая, что у вас установлена Visual Studio, загляните в реестр по адресу HKEY_CLASSES_ROOTVisualStudio.Launcher.sln
, чтобы увидеть, как это делается.
Итак, в основном вам нужно:
- Напишите исполняемый файл, который может решать, что делать с
.xml
файлами - Зарегистрируйте процесс как тот, который отвечает за обработку
.xml
файлов - Поместите логику в свой исполняемый файл или в конфигурацию, которую использует ваш исполняемый файл, которая решает, что делать для каждого файла.
Что касается значков, взгляните на подраздел ShellExIconHandler
. Вы увидите, что это указывает на (на компьютере x64 с установленной Visual Studio 2010), HKEY_CLASSES_ROOTWow6432NodeCLSID{9A2B23E4-2A50-48DB-B3C3-F5EA12947CB8}
который перечисляет под InprocServer32
DLL, которая отвечает за предоставление значков для файлов, в данном случае C:Program Files (x86)Common FilesMicrosoft SharedMSEnvVSFileHandler.dll
. Вам нужно будет реализовать аналогичную DLL, которая разделяет конфигурацию / логику вашего процесса запуска, чтобы определить, какой значок отображать для каждого файла.
Обычное предостережение: писать расширения оболочки в управляемом коде всегда было большим «нет-нет», потому что расширения оболочки загружаются в любой процесс, который показывает общие диалоговые окна файлов. Это может вызвать веселый хаос, поскольку вплоть до .net 4.0 в процесс можно было загрузить только одну версию среды CLR, поэтому вы должны быть очень уверены, прежде чем делать это. Учитывая, что .net 4.0 поддерживает in-process side by side, для вас это может не быть проблемой.
Ответ №2:
Нет. В Windows XML-файл — это XML-файл. ОС не заглядывает внутрь, чтобы увидеть, какое пространство имен с ним связано; это просто XML-файл.
Windows связывает типы файлов с их расширением, поэтому, опять же, все XML-файлы являются XML-файлами. Вы можете убедиться в этом сами: переименуйте обычный файл .txt, который абсолютно не содержит XML, а затем обновите представление его папки в проводнике. Вы увидите, как значок изменится с изображения текстового файла на изображение XML-файла.
Ответ №3:
Вы не можете сделать это без использования пользовательских расширений или программы-посредника.
Возможно, одним из вариантов было бы иметь пользовательское приложение, которое назначено для обработки XML-файлов. При запуске этой is-программы она определяет, какой «тип» файла использует один из тегов XML, и соответствующим образом запускает правильный процесс. Однако маловероятно, что вы можете присвоить разным «типам» разные значки.