C# 注册表项已更改为新的csproj格式

C# 注册表项已更改为新的csproj格式,c#,registry,csproj,C#,Registry,Csproj,对于我们的一个项目,为了准备.net核心迁移,我更改了csproj格式。 目前我们正在使用.NETFramework 4.8 我没有更改代码中的任何内容,但后来出现了一个bug,应用程序无法再找到注册表项。这两次应用程序都是在使用AnyCPU进行调试时生成的 在同一台64位计算机上 string registry_key32 = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; using (RegistryKey key = Reg

对于我们的一个项目,为了准备.net核心迁移,我更改了csproj格式。 目前我们正在使用.NETFramework 4.8

我没有更改代码中的任何内容,但后来出现了一个bug,应用程序无法再找到注册表项。这两次应用程序都是在使用AnyCPU进行调试时生成的 在同一台64位计算机上

string registry_key32 = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
{
    var subKeys = key.GetSubKeyNames();
}
在更改前返回约400个键,之后仅返回约200个键


当从旧的csproj格式移动到新的csproj格式时,为什么此方法调用的结果会发生变化?

我无法告诉您为什么会发生变化,但新的csproj格式似乎使用了.net核心编译规则。因此,当您从.net Framework迁移到.net Core时,这个问题也会发生,就像这里已经提到的那样

为“x86”编译:

为“x64”编译:

为“AnyCpu”编译的.NET应用程序

长话短说,解决方案是也硬代码检查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();
}
Always 64 bit
On 32-bit platforms, won't run
On 64-bit platforms, accesses 64-bit registry (not inside Wow6432Node)
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)
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();
}