Visual Studio 2015を使用しています。アンインストール時にExcelアドインを「登録解除」するインストーラカスタムアクションを作成しようとしています。基本的には、HKCU\Software\Microsoft\Office
のキーを調べ、バージョン番号(16.0
など)のサブキーを見つけて、Excel\Options
サブキー(存在する場合)を調べて、OPEN
のいずれかのアドイン名をチェックする必要がありますExcelは、OPEN
、OPEN1
、OPEN2
などを使用して、レジストリ内のアドインを列挙します。インストーラのカスタムアクションですべてのレジストリ値を読み取ることができません
カスタムアクションをデバッグすると、すべてのレジストリ値を表示できないように見えます。例として、実際に10のサブキーがある場合、HKCU\Software\Microsoft\Office
の下に8つのサブキーがあると報告します。のいずれかを使用してRegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32)
:
のx64:RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64)
x86の私は以下のように特定のレジストリビューを開くには、アプリケーションを強制しようとしてきたので、私は、これは、仮想化をレジストリに起因することを推測していますこれらの呼び出しは全く同じ制限付きレジストリビューになります(私はまだ8つのキーを10回以上見ています)。だから、インストーラのカスタムアクションは何らかの理由で特定のレジストリビューを強制することができないようです。
これを回避するための追加テストを行うためのコンソールアプリケーションを作成しました。コンソールアプリケーションは、x64またはx86プラットフォームをターゲットにしてコンパイルされているかどうかにかかわらず、フル10キーを見ることができます。
私はここで紛失しています。これはVS2015セットアッププロジェクトの既知の問題ですか?彼らはレジストリの特定の部分を見る能力に限界がありますか?それとも、自分のコードエラーですか?
ここでは、アドインの登録を解除するために使用しようとしているコードを示します。私はアンインストールプロセスで致命的なエラーを引き起こしていた途中で、大量のエラーチェックを追加しました。今やアンインストールは(クラッシュを引き起こさない限り)機能しますが、実際にアドインを登録解除するわけではありません。
If Registry.CurrentUser.OpenSubKey("Software\Microsoft\Office", True) IsNot Nothing Then
Dim regCUOffice As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Office", True)
If regCUOffice.GetSubKeyNames.Count > 0 Then
For Each strKeyName As String In regCUOffice.GetSubKeyNames
If regCUOffice.OpenSubKey(strKeyName & "\Excel\Options", True) IsNot Nothing Then
Dim regExcelOptionsKey As RegistryKey = regCUOffice.OpenSubKey(strKeyName, True).OpenSubKey("Excel\Options", True)
For Each strValueName As String In regExcelOptionsKey.GetValueNames
If strValueName IsNot Nothing Then
If (strValueName.Equals("OPEN") Or strValueName.StartsWith("OPEN")) Then
If regExcelOptionsKey.GetValue(strValueName) IsNot Nothing Then
If regExcelOptionsKey.GetValue(strValueName).Equals("MyAddIn.xll") Then
regExcelOptionsKey.DeleteValue(strValueName)
End If
End If
End If
End If
Next
regExcelOptionsKey.Close()
End If
Next
End If
regCUOffice.Close()
End If