Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C获取注册表值#_C#_.net_Registry - Fatal编程技术网

C# 使用C获取注册表值#

C# 使用C获取注册表值#,c#,.net,registry,C#,.net,Registry,我无法检索软件的Installdir。我尝试过GetValue甚至OpenSubKey,但每次都得到一个空值。我使用的是VS2008、.NET3.5、64位机器、32位进程设置 private string GetInstallPath() { string keyValue = string.Empty; Object key = Registry.GetValue("HKEY_CURRENT_USER\\SOFTWARE\\My Company\\My Tool", "I

我无法检索软件的Installdir。我尝试过GetValue甚至OpenSubKey,但每次都得到一个空值。我使用的是VS2008、.NET3.5、64位机器、32位进程设置

private string GetInstallPath()
{
     string keyValue = string.Empty;
     Object key = Registry.GetValue("HKEY_CURRENT_USER\\SOFTWARE\\My Company\\My Tool", "Installdir", null);
     ...
}
键返回NULL,但其中存在有效字符串。等效代码在VC++中工作。请提供您对该问题的见解。对于这项看似简单的任务,我做错了什么?我不能使用“蜂巢”,因为它是4.0标准。代码级帮助,而不是链接将是有帮助的

VC++等价物

HKEY hkey = NULL;
LSTATUS status = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SOFTWARE\\My Company\\My Tool\\", 0, KEY_READ, &hkey );

if ( status == ERROR_SUCCESS )
{
  DWORD type;
  char  buff[ 100 ];
  DWORD numBytes = sizeof( buff );
  if ( RegQueryValueExA( hkey, REGISTRY_ENTRY, NULL, &type, (LPBYTE) buff, &numBytes ) == ERROR_SUCCESS )
 {
 ...
 }

你提到你的机器是x64,你的应用程序是32位的,除非我读错了。考虑到您的环境,我首先要检查的是确保密钥存在于64位节点中,
HKCU\Software\My Company\…
,而不是32位节点中,
HKCU\Software\Wow6432Node\My Company\…
,如果您的密钥存在于32位节点中,则需要确保您的应用程序是32位应用程序,否则,你需要确保你的应用程序是64位的,否则你找不到密钥

以下代码适用于我,以64位运行,并在WOW6432节点的外部找到了键。我不明白为什么您不能使用“Hive”,它在3.5和4.0中都能工作

RegistryKey regKey = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\VisualStudio\\10.0");

if (regKey != null)
{
    object val = regKey.GetValue("FullScreen");
}
更新: 以下内容也适用于我,运行.NET 3.5,如果不是平台(x86 vs x64)问题,那么可能是权限问题,请确保应用程序运行的上下文可以访问注册表项(尝试以管理员甚至系统身份运行应用程序)


你提到你的机器是x64,你的应用程序是32位的,除非我读错了。考虑到您的环境,我首先要检查的是确保密钥存在于64位节点中,
HKCU\Software\My Company\…
,而不是32位节点中,
HKCU\Software\Wow6432Node\My Company\…
,如果您的密钥存在于32位节点中,则需要确保您的应用程序是32位应用程序,否则,你需要确保你的应用程序是64位的,否则你找不到密钥

以下代码适用于我,以64位运行,并在WOW6432节点的外部找到了键。我不明白为什么您不能使用“Hive”,它在3.5和4.0中都能工作

RegistryKey regKey = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\VisualStudio\\10.0");

if (regKey != null)
{
    object val = regKey.GetValue("FullScreen");
}
更新: 以下内容也适用于我,运行.NET 3.5,如果不是平台(x86 vs x64)问题,那么可能是权限问题,请确保应用程序运行的上下文可以访问注册表项(尝试以管理员甚至系统身份运行应用程序)


添加了与VC++等效的edit。@santra_a我发布了一个正在工作的c#,它实际上将遍历并找到一个定义,然后将修改卸载字符串以修复应用程序。我相信这就是你想要的吗?添加了VC++等价物作为“编辑”。@santra_a我发布了一个正在工作的c#,它实际上会经过并找到一个定义,然后会修改卸载字符串以修复应用程序。我相信这就是你要找的,对吗?你要我检查的第一件事是错误点。我必须在“任何CPU”的平台目标中将代码显式设置为“x86”。这是因为我试图获取信息的应用程序是32位的,因此在Wow6432中。@santra_很高兴听到这个问题得到解决,是的,
AnyCPU
将在64位系统上以64位运行,在x86系统上以32位运行,除非初始条目程序集另有说明:)您希望我检查的第一件事是错误点。我必须在“任何CPU”的平台目标中将代码显式设置为“x86”。这是因为我试图获取信息的应用程序是32位的,因此在Wow6432中。@santra_很高兴听到这个问题得到解决,是的,
AnyCPU
将在64位系统上以64位运行,在x86系统上以32位运行,除非初始入口程序集另有说明:)