RegistryKey更改为新的csproj格式

问题描述 投票:0回答:1

对于我们的一个项目,我更改了csproj格式,以便为.net Core迁移做准备。当前,我们正在使用.net Framework 4.8。

我没有更改代码中的任何内容,但之后发生了一个错误,该应用程序不再能够找到注册表项。两次都使用AnyCPU在Debug中构建应用程序在同一64位计算机上。

string registry_key32 = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
{
    var subKeys = key.GetSubKeyNames();
}

此键在更改前返回〜400个键,之后仅返回〜200。

为什么从旧的csproj格式转换到新的cpropro格式后,此方法调用的结果会发生变化?

c# registry csproj
1个回答
0
投票

我无法告诉您它为什么更改,但是.net核心编译规则似乎与新的csproj格式一起使用。因此,当您从.net Framework迁移到.net Core时,如在此处Searching registry keys giving different outputs in .net core and .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();
}
© www.soinside.com 2019 - 2024. All rights reserved.