对于我们的一个项目,我更改了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格式后,此方法调用的结果会发生变化?
我无法告诉您它为什么更改,但是.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();
}