[英]RegistryKey changed with new csproj Format
对于我们的一个项目,我更改了 csproj 格式,以便为 .net Core 迁移做准备。 目前我们使用的是 .net Framework 4.8。
我没有更改代码中的任何内容,但后来发生了错误,应用程序无法再找到注册表项。 两次应用程序都是在同一台 64 位机器上使用 AnyCPU 在 Debug 中构建的。
string registry_key32 = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
{
var subKeys = key.GetSubKeyNames();
}
在更改之前返回 ~400 个键,之后它只返回 ~200。
为什么从旧的 csproj 格式转移到新的 csproj 格式时,此方法调用的结果会发生变化?
我不能告诉你它为什么改变,但似乎 .net 核心编译规则与新的 csproj 格式一起使用。 所以这个问题也会发生,当你从 .net Framework 迁移到 .net Core 时,就像这里已经问过的那样搜索注册表项在 .net core 和 .net framwork 中提供不同的输出。
为“x86”编译:
Always 32-bit
On 32-bit platforms, accesses 32-bit registry
On 64-bit platforms, accesses 32-bit registry (inside Wow6432Node)
为“x64”编译:
Always 64 bit
On 32-bit platforms, won't run
On 64-bit platforms, accesses 64-bit registry (not inside Wow6432Node)
为“AnyCpu”编译的 .NET 应用程序
Either 32 or 64 bit depending on platform
On 32-bit platforms, accesses 32-bit registry
On 64-bit platforms, accesses 64-bit registry (not inside Wow6432Node)
长话短说,解决方案也是硬编码检查 64 位注册表项。
string registry_key32 = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
{
var subKeys = key.GetSubKeyNames();
}
string registry_key64 = @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall";
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
{
var subKeys = key.GetSubKeyNames();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.