Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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
.net 如何构建与x64、Windows 7兼容的应用程序?_.net_64 Bit_Registry Virtualization - Fatal编程技术网

.net 如何构建与x64、Windows 7兼容的应用程序?

.net 如何构建与x64、Windows 7兼容的应用程序?,.net,64-bit,registry-virtualization,.net,64 Bit,Registry Virtualization,我们有一个访问注册表的遗留应用程序。因为它是32位应用程序,所以在引用HKEY_LOCAL_MACHINE\软件时,它会通过注册表虚拟化访问Windows 7中的注册表我的问题是,我们需要修改Visual Studio中的哪些设置来编译应用程序,使它们“正常”访问注册表,而无需通过注册表虚拟化?为什么不使用: Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\.

我们有一个访问注册表的遗留应用程序。因为它是32位应用程序,所以在引用HKEY_LOCAL_MACHINE\软件时,它会通过注册表虚拟化访问Windows 7中的注册表我的问题是,我们需要修改Visual Studio中的哪些设置来编译应用程序,使它们“正常”访问注册表,而无需通过注册表虚拟化?

为什么不使用:

Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\...");
return (string)key.GetValue("blah");
并在customtrust.config文件中添加对注册表的访问权限


或者这在Windows 7中不起作用?

如果仔细阅读注册表虚拟化页面,您会注意到虚拟化并不限于64位Windows。它只声明只有32位进程将被虚拟化。但是虚拟化是在32位和64位Vista以及更高版本上完成的。因此,问题标题和x64标记有点误导

为了回答您的问题,同一页上说: “注册表虚拟化已针对以下对象禁用:……在清单中指定了requestedExecutionLevel的进程。”


因此,您可以通过向指定其执行级别的可执行文件添加清单文件来禁用虚拟化。至少有一篇Microsoft KB文章介绍了如何在Visual Studio 2005中执行此操作:。

解决方案是将遗留应用程序编译为目标x64。明确针对x64的应用程序将不受注册表虚拟化的约束。

这不是答案,但如果可以避免,我建议不要使用注册表。这是.NET,所以请使用配置文件。@Steven我们已经并正在考虑使用配置文件。我只是想确保在我构建一个案例来更改代码之前,我对如何实现这一点有一个坚实的理解。这很公平。我希望您能够成功地构建一个案例。该代码可以工作,但不适用于此旧应用程序。我阅读了文档,其中指出,如果应用程序与Windows 7不兼容,那么它的注册表访问将使用注册表虚拟化路由到另一个位置。这很有趣,我不知道存在这种情况。你能模拟一个有权访问注册表项的用户吗?这将消除注册表虚拟化的使用。我面临的问题是,应用程序配置了一个全局注册表位置,多个应用程序可以访问该位置。应用程序找不到设置,因为它们被隐藏在此虚拟位置。是的,这也适用于注册表虚拟化问题。然而,嵌入式清单还有其他优点。它显示应用程序“支持Vista/Win 7”,并指定应用程序是否需要以管理员或标准用户权限运行。我绝对建议在任何情况下都添加它。哎呀,我忘了提到,因为注册表虚拟化在32位和64位操作系统上都会发生,所以我知道在32位Windows上唯一合法的解决方案就是创建清单。