Оболочка Windows: как связать разные xml-файлы с разными приложениями?

#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 , чтобы увидеть, как это делается.

Итак, в основном вам нужно:

  1. Напишите исполняемый файл, который может решать, что делать с .xml файлами
  2. Зарегистрируйте процесс как тот, который отвечает за обработку .xml файлов
  3. Поместите логику в свой исполняемый файл или в конфигурацию, которую использует ваш исполняемый файл, которая решает, что делать для каждого файла.

Что касается значков, взгляните на подраздел 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, и соответствующим образом запускает правильный процесс. Однако маловероятно, что вы можете присвоить разным «типам» разные значки.