2

別の C# アプリケーション内から、その名前で ClickOnce アプリケーションを実行したいと考えています。現在の方法では、Uninstall レジストリ キー (HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\[PublicKeyToken]\ShortcutAppId.

すべての ClickOnce アプリケーションが格納されるネットワーク フォルダーがあります。ClickOnce アプリケーションへのすべてのショートカットは、そのフォルダー内の .Application ファイルを対象としています。

アプリケーションが Z:\ClickOnceApps\MyApp に配置されたときに問題が発生しましたが、\\server\share\ClickOnceApps\MyApp\MyApp.application からインストールされました。その場合、レジストリに保存されている ShortcutAppId は Z:\ClickOnceApps\MyApps\MyApps.Application#[...] このパスを使用してアプリケーションを起動しようとすると、インストールするように求められます。実際のインストール パスは、アプリケーション ID の一部です。

したがって、基本的には、アプリケーションがインストールされたのと同じパスからしかアプリケーションを起動できません。

私の質問: アプリケーションがインストールされた正確なパス (展開パスではなく) を取得するにはどうすればよいですか?

興味のある人のために ShortcutAppId を取得するコードは次のとおりです。

Public Class ClickOnceApp

        Public Property DisplayName As String
        Public Property UninstallString As String
        Public Property PublicKeyToken As String
        Public Property DisplayVersion As Version
        Public Property ShortcutAppId As String

        Public ReadOnly Property ShortcutPath As String
            Get

                Dim pawnIndex = ShortcutAppId.IndexOf("#"c)
                If pawnIndex = -1 Then
                    Return ""
                Else
                    Return ShortcutAppId.Substring(0, pawnIndex)
                End If

            End Get
        End Property

        Public Sub New(appUninstallKey As RegistryKey)

            Me.DisplayName = appUninstallKey.GetValue("DisplayName")
            Me.UninstallString = appUninstallKey.GetValue("UninstallString")
            Me.PublicKeyToken = appUninstallKey.GetValue("PublicKeyToken")
            Me.DisplayVersion = New Version(appUninstallKey.GetValue("DisplayVersion"))
            Me.ShortcutAppId = appUninstallKey.GetValue("ShortcutAppId")

        End Sub

        Public Sub Launch()
            Process.Start(ShortcutPath)
        End Sub

    End Class


    Public Class ClickOnceHelper

        Public Shared Function GetInstalledClickOnceApps() As ClickOnceApp()

            Dim list As New List(Of ClickOnceApp)()

            Using uninstallKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")

                For Each subKeyName In (From keyName In uninstallKey.GetSubKeyNames() _
                                    Where keyName.Length = 16)

                    Using appKey = uninstallKey.OpenSubKey(subKeyName)

                        If CStr(appKey.GetValue("UninstallString")).StartsWith("rundll32.exe dfshim.dll") Then

                            Dim app = New ClickOnceApp(appKey)
                            list.Add(app)

                        End If

                    End Using

                Next

            End Using

            Return list.ToArray()

        End Function

        Public Shared Function FindClickOnceAppByName(name As String) As ClickOnceApp

            Dim list = GetInstalledClickOnceApps()
            Return (From app In list _
                    Where app.DisplayName.ToLower() = name.ToLower()).FirstOrDefault()

        End Function

        Public Shared Function FindClickOnceAppByPublicKey(publicKeyToken As String) As ClickOnceApp

            Dim list = GetInstalledClickOnceApps()
            Return (From app In list _
                    Where app.PublicKeyToken = publicKeyToken).FirstOrDefault()
        End Function

End Class
4

0 に答える 0