如何在安装后手动注册ClickOnce文件关联?

微软的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的ClickOnce文件关联管理器

    我已经通过注册表进行了一些挖掘,并确定了ClickOnce安装程序所做的几个条目,以将文件类型与ClickOnce部署的应用程序相关联。

    在我的注册表中找到的ClickOnce文件类型关联的示例注册表项:

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

    其中{ae74407a-1faa-4fda-9056-b178562cf98f}是用于关联应用程序的注册表中几个其他位置的GUID。

    我的目标是要了解必须将哪些信息添加到注册表(以编程方式)以手动将文件与ClickOnce部署的应用程序相关联。

    任何帮助表示赞赏!


    您可以使用Windows Sysinternals Process Monitor(以前称为RegMon)来计算要添加的注册表项。

    捕获事件,当您使用ClickOnce以默认文件关联安装您的应用程序时。 它会记录所有的注册表操作(其中有很多)。

    您需要使用一些过滤器来轻松识别注册表项。


    好吧,在遇到同样的问题并做了一些认真的挖掘之后,我想我有一个解决方案。 Evan Wondrasek与rundll命令走在了正确的道路上,我能够在测试环境中获得以下工作。

    本质上Uri Abramson是正确的,rundll.exe命令中的Guid是对clickonce应用程序的引用,但它并未出现在注册表中的任何其他位置。 它所引用的实际上是HKCUSoftwareClasses的其他Keys。

    要使文件参考起作用,首先需要为您的应用程序提供ProgID 。 据我所知,这可以是任何你想要的,或者你通常在Visual Studio的ClickOnce发布菜单中设置的任何东西。

    您还需要创建一个新的Guid,并知道应用程序参考(.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
    

    请在下面的代码中使用上面的值。

    首先,使用以下字符串在HKCUSoftwareClasses下创建一个名为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}
    

    一旦你设置了这些值,创建两个新的subKeys shellshellex

    设置shell(Default)open 。 然后创建一个子项shellopen ,和一个子项opencommand 。 将command(Default)值设置为以下内容:

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

    创建一个名为IconHandlershellex IconHandler并将其(Default)值设置为{ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}

    导航到HKCUSoftwareClassesCLSID并使用以下字符串创建一个新密钥{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项目中。

    现在使用以下值在名为InProcServer32 {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}下创建一个{ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}

    (Default) = dfshim.dll
    ThreadingModel = Apartment
    

    最后,我们需要将以前的键与我们所需的文件关联关联起来。 为此,导航到HKCUSoftwareClasses ,并为每个所需的文件扩展名执行以下操作。

    如下所示设置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应用程序支持库”条目添加到“打开方式”菜单中。

    希望这适用于除我以外的其他人,并为冗长的例子感到抱歉。


    Assoc命令怎么样?

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


    assoc /?

    显示或修改文件扩展名关联

    ASSOC [.ext [= [fileType]]]

    .ext指定将文件类型与fileType关联的文件扩展名指定要与文件扩展名关联的文件类型

    键入不带参数的ASSOC来显示当前文件关联。 如果仅使用文件扩展名调用ASSOC,则会显示该文件扩展名的当前文件关联。 不指定文件类型,命令将删除文件扩展名的关联。


    文件关联可以是机器级别或用户级别 - 通常,HKCR区域中的内容用于机器级别的文件关联。 HKCU /软件/类区域中的东西是用户定制的每个用户的东西(或者您为他们定制的东西)。 像“assoc”这样的东西可以在XP,7和Win 8上运行(尽管我还没有在win 8上使用过这个cmd)。

    链接地址: http://www.djcxy.com/p/22725.html

    上一篇: How to manually register ClickOnce file associations after installation?

    下一篇: What are the web server requirements for ClickOnce deployment?