如何从Wix托管引导程序或自定义操作读取特定注册表项?

如何从Wix托管引导程序或自定义操作读取特定注册表项?,wix,windows-installer,custom-action,Wix,Windows Installer,Custom Action,从托管引导程序(.NET 4.5.2)和自定义操作(尝试了.NET 2.0和4.0)读取此密钥时遇到问题 HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component-Based Service\Packages 我尝试使用cmd作为管理员运行引导程序和msi。我的测试环境是Windows 7 64位。我正在使用WIX3.11 我制作了一个测试命令行应用程序,它能够访问这个密钥 我在引导程序和自定义操作中使用

从托管引导程序(.NET 4.5.2)和自定义操作(尝试了.NET 2.0和4.0)读取此密钥时遇到问题

HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component-Based Service\Packages

我尝试使用cmd作为管理员运行引导程序和msi。我的测试环境是Windows 7 64位。我正在使用WIX3.11

我制作了一个测试命令行应用程序,它能够访问这个密钥

我在引导程序和自定义操作中使用的测试代码:

静态注册表项GetHKLMKey(字符串注册表路径){
var hklm64=RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,RegistryView.Registry64);
var registryKey64=hklm64.OpenSubKey(registryPath);
if((registryKey64?.GetValueNames().Any()).GetValueOrDefault()){
返回注册表键64;
}
var hklm32=RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,RegistryView.Registry32);
返回hklm32.OpenSubKey(registryPath);
}
}
...
变量路径=@“软件”;
foreach(@Microsoft\Windows\CurrentVersion\Component-Based Service\Packages.Split(“\\”)中的var段){
路径+=“\\”+段;
var j=GetHKLMKey(路径);
日志(路径+”:“+j);
var k=Registry.LocalMachine.OpenSubKey(路径);
日志(路径+”:“+k);
如果(k==null)返回true;
}
测试输出

SOFTWARE\Microsoft: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
SOFTWARE\Microsoft: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
SOFTWARE\Microsoft\Windows: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
SOFTWARE\Microsoft\Windows: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
SOFTWARE\Microsoft\Windows\CurrentVersion: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
SOFTWARE\Microsoft\Windows\CurrentVersion: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing
SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing
SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages: 
SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages: 
调试托管代码自定义操作:不太清楚问题出在哪里?读取不作为自定义操作工作?尝试显示来自自定义操作的消息框,然后将调试器附加到运行托管代码的
rundll32.exe
进程。然后,您可以使用VisualStudio以正常的“调试方式”逐步完成代码。下面是一段很好的视频,向您展示了如何做到这一点:

注册表读取:一旦具备可调试性,就应该能够找出您所看到的任何问题的原因

  • 抑制异常:可能发生了某种类型的异常,并且您已将自定义操作的错误检查设置为“
    忽略退出代码”
  • 比特率:最常见的问题似乎是-换句话说,您读取了错误的注册表位置,但我认为这不是您看到的问题
  • 访问冲突?:也可能是在安装程序提升为管理员权限之前,您正在运行需要GUI序列中管理员权限的程序。这可能会触发访问权限异常

只是我脑子里的一些想法。请告诉我们是什么。

这是一个小问题。我的代码在这里有一个问题
if((registryKey64?.GetValueNames().Any()).GetValueOrDefault()){
。我改为
if(registryKey64!=null){
并且它按预期工作。您的“调试C#自定义操作”很有帮助。很好,你找到了它,谢谢你让我们知道它是什么。当然,这是我认为不是的。很自然!:-)我在咬人问题上浪费了很多时间-我认为这个问题让每个人都很紧张。