Подтвердить что ты не робот

Как вручную зарегистрировать ассоциации файлов ClickOnce после установки?

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.

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Итак, после того, как я столкнулся с той же проблемой и совершил серьезный рытье, я думаю, что у меня есть решение. Evan Wondrasek был на правильном пути с командой 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. Затем создайте subKey shell, называемый open, и subKey из open, называемый command. Задайте значение (Default) command следующим образом:

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

Создайте subKey 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.

Теперь создайте subKey под {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" в меню "Открыть с".

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

Ответ 3

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

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


ассоциат /?

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

ASSOC [.ext [= [fileType]]]

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

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


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

Ответ 4

Если вы хотите вручную зарегистрировать ассоциацию файлов, это не бизнес 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-----");
    }

Ответ 5

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

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