Как вручную зарегистрировать ассоциации файлов ClickOnce после установки? - PullRequest
44 голосов
/ 10 января 2012

Microsoft Система развертывания ClickOnce предлагает простой в использовании диспетчер сопоставления файлов, который встроен в процесс развертывания Visual Studio .Разработчики могут добавить до 8 ассоциаций файлов, которые будут автоматически связаны с их приложением, когда пользователь запустит установщик ClickOnce.

Я хотел бы сделать еще один шаг вперед, хотя: Я хочу разрешитьпользователи могут вручную добавлять или удалять дополнительные ассоциации файлов после установки из моего приложения.

У меня есть две причины для этого:

  • Я выигралне «навязывать» дополнительные ассоциации файлов пользователю, что позволяет обрабатывать ассоциации файлов в развертываниях ClickOnce.
  • Пользователи могут добавлять или удалять свои собственные уникальные ассоциации файлов на досуге.

Сложная часть: прямое сопоставление типа файла с исполняемым файлом несовместимо с развертываниями ClickOnce

В отличие от традиционных приложений Windows, приложения ClickOnce не запускаются напрямую через их исполняемый файл.Вместо этого они запускаются с помощью специального ярлыка .appref-ms, который обрабатывает магию ClickOnce за кулисами (автоматическое обновление, размещение исполняемых файлов в запутанном каталоге в %LOCALAPPDATA% и т. Д.).

Если приложение, развернутое в ClickOnce, открывается непосредственно через его исполняемый файл, автоматические обновления отключаются, и методы, специфичные для ClickOnce, больше не будут работать.Из-за этого в моем случае использования традиционные ассоциации файлов реестра невозможны.

Как Visual Studio обрабатывает ассоциации файлов ClickOnce

На рисунке ниже показан встроенный в Visual Studio 2010 диспетчер ассоциаций файлов ClickOnce.Эта информация хранится в файле приложения .manifest и добавляется в реестр Windows после установки.

VS2010's ClickOnce File Association Manager

Я немного покопался в своем реестре и определил несколько сделанных записей.с помощью установщика ClickOnce, чтобы связать типы файлов с развернутым приложением ClickOnce.

Пример раздела реестра для ассоциации типов файлов ClickOnce, который я нашел в своем реестре:

rundll32.exe dfshim.dll, ShOpenVerbExtension {ae74407a-1faa-4fda-9056-b178562cf98f} %1

Где {ae74407a-1faa-4fda-9056-b178562cf98f} - это GUID, используемый в нескольких других местах вреестр для связанного приложения.

Моя цель - узнать, какую информацию необходимо добавить в реестр (программно), чтобы вручную связать файлы с развернутым приложением ClickOnce.

Любая помощь приветствуется!

Ответы [ 5 ]

2 голосов
/ 24 мая 2014

Хорошо, так что после того, как я столкнулся с той же проблемой и сделал серьезную копку, думаю, у меня есть решение Эван Вондрасек был на правильном пути с командой rundll, и я смог добиться следующего, работая в тестовой среде.

По сути, Ури Абрамсон был прав, что Guid в команде rundll.exe является ссылкой на приложение clickonce, но его больше нет в реестре. На самом деле он ссылается на другие ключи в HKCU\Software\Classes.

Чтобы справка по файлу работала, сначала вам нужно ProgID для вашего приложения. Насколько мне известно, это может быть все, что вы хотите, или то, что вы обычно устанавливаете в меню публикации ClickOnce в Visual Studio.

Вам также нужно будет создать новый Guid и знать содержимое файла Application Reference (.appref-ms).

Для моего примера я буду использовать следующее:

ProgId: FASERVER.TestApp
Guid: ce6b2c69-ec54-4182-a87f-74c5dfe1a03e
AppRefFileContents: http://SomeAddress.SomeDomain/TestApp/TestApp.application#TestApp.application, Culture=neutral, PublicKeyToken=df31b9b884b9be10, processorArchitecture=x86

Пожалуйста, используйте ваш эквивалент вышеуказанных значений в следующем коде.

Для начала создайте новый раздел реестра под HKCU\Software\Classes с именем FASERVER.TestApp со следующими строками:

(Default) = SomeFileType
AppId = TestApp.application, Culture=neutral, PublicKeyToken=df31b9b884b9be10, processorArchitecture=x86
DeploymentProviderUrl = http://SomeAddress.SomeDomain/TestApp/TestApp.application
Guid = {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}

После того, как вы установили эти значения, создайте два новых вспомогательных ключа shell и shellex.

Установите (Default) значение shell на open. Затем создайте дополнительный ключ shell с именем open и дополнительный ключ open с именем command. Установите (Default) значение command на следующее:

rundll32.exe dfshim.dll, ShOpenVerbExtension {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e} %1

Создайте вложенный ключ shellex с именем IconHandler и установите для его значения (Default) значение {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}

Перейдите к HKCU\Software\Classes\CLSID и создайте новый ключ {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e} со следующими строками:

(Default) = Shell Icon Handler For Tif File
AppId = TestApp.application, Culture=neutral, PublicKeyToken=df31b9b884b9be10, processorArchitecture=x86
DeploymentProviderUrl = http://SomeAddress.SomeDomain/TestApp/TestApp.application
IconFile = YourIconFile.ico

Примечание. Ваша иконка должна быть в вашем проекте ClickOnce.

Теперь создайте вложенный ключ в {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e} с именем InProcServer32 со следующими значениями:

(Default) = dfshim.dll
ThreadingModel = Apartment

Наконец, нам нужно связать предыдущие ключи с желаемыми ассоциациями файлов. Для этого перейдите к HKCU\Software\Classes и выполните следующие действия для каждого желаемого расширения файла.

Установите строки FileExt следующим образом:

(Default) = FASERVER.TestApp
AppId = TestApp.application, Culture=neutral, PublicKeyToken=df31b9b884b9be10, processorArchitecture=x86
DeploymentProviderUrl = http://SomeAddress.SomeDomain/TestApp/TestApp.application
Guid = {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}

Вот и все! Вы должны быть сделаны.

Обратите внимание, что это не сделает ваше приложение программой по умолчанию для этого типа файлов, а просто добавит запись «Библиотека поддержки приложений ClickOnce» в меню «Открыть с помощью».

Надеюсь, что это работает для кого-то, кроме меня, и извините за длинный пример.

2 голосов
/ 30 мая 2013

Вы можете выяснить, какие разделы реестра нужно добавить, используя Windows Sysinternals Process Monitor (ранее известный как RegMon).

Захват событий при установке приложения с использованием ClickOnce с сопоставлениями файлов по умолчанию.Он будет записывать все операции реестра (их много).

Вам потребуется использовать несколько фильтров, чтобы легко идентифицировать разделы реестра.

1 голос
/ 10 мая 2013

Если вы хотите вручную зарегистрировать сопоставление файлов, это не касается ClickOnce. Вы можете вручную добавить ключи в реестр для настройки ассоциации файлов. И если вы хотите удалить ассоциацию, которая устанавливается clickonce, просто удалите ключ реестра.

    private static void SetFileAssociation(string icon, string application, string openArg, string extension , string progId , string description )
    {
        Trace.WriteLine("-----Create File Association-----");
        RegistryKey classesKey = Registry.CurrentUser.OpenSubKey(@"Software\Classes", true);
        classesKey.CreateSubKey(extension).SetValue(string.Empty, progId);
        RegistryKey progKey = classesKey.CreateSubKey(progId);
        if (description != null)
        {
            progKey.SetValue(string.Empty, description);
        }
        if (icon != null)
        {
            progKey.CreateSubKey("DefaultIcon").SetValue(string.Empty, icon);
        }

        progKey.CreateSubKey(@"Shell\Open\Command").SetValue(string.Empty,
            application + openArg);
        Trace.WriteLine("-----Finish File Association-----");
    }
1 голос
/ 26 декабря 2012

А как насчет команды Assoc?

http://support.microsoft.com/kb/184082

<ч /> Assoc /?

Отображает или изменяет ассоциации расширений файлов

ASSOC [.ext [= [fileType]]]

.ext Определяет расширение файла, чтобы связать тип файла с fileType Определяет тип файла для связи с расширением файла

Введите ASSOC без параметров, чтобы отобразить текущие ассоциации файлов. Если ASSOC вызывается только с расширением файла, он отображает текущий сопоставление файлов для этого расширения файла. Ничего не указывайте для файла введите и команда удалит ассоциацию для расширения файла.

<ч />

Файловые ассоциации могут быть на уровне машины или на уровне пользователя - Обычно материал в области HKCR предназначен для сопоставления файлов на уровне компьютера. Материал в области HKCU / Software / Classes - это материал для каждого пользователя, который пользователь настроил (или вы настроили для него). Что-то вроде «assoc» будет работать на XP, 7 и, возможно, на Win 8 (хотя я еще не использовал этот cmd на win 8).

0 голосов
/ 11 сентября 2015

Обход: Вы можете связать с ярлыком приложения ClickOnce, расположенным в:

C:\Users\[Your username]\AppData\Roaming\Microsoft\Windows\Start Menu\[Program folder]\[Shortcut name]
...