![](/img/trans.png)
[英]Can I access files and Registry keys in the Windows Virtual Store, from a non-virtualized application?
[英]Windows service reading from virtualized registry
如果我错了,请更正我,因为我敢肯定我在某处读过:Windows服务已禁用注册表虚拟化。 此外,对于x64二进制文件,虚拟化被禁用。
我有一个用C#编写的Windows服务,需要从HKEY_LOCAL_MACHINE \\ SOFTWARE加载值。 当我将服务编译为x86并启动它时,它无法读取该值。 当我编译与x64相同的代码并启动它时,它将读取该值。 我希望我的服务能够在x64机器之外的x86机器上运行,但是它还必须能够读取此值。 如何获取Windows服务以读取非虚拟值?
Windows服务禁用了注册表虚拟化。 此外,对于x64二进制文件,虚拟化被禁用。
是的,是的,它对于64位进程和“ 非交互式进程,例如服务 ”已禁用。
看看我以前关于SO的文章,了解有关注册表视图的一些详细信息。 请不要将视图与虚拟化混淆。 他们不同。 需要使用视图将32位应用程序与64位应用程序隔离。
在C#中,您可以简单地要求操作系统打开64位版本的注册表来执行以下操作:
RegistryKey baseKey = RegistryKey.OpenBaseKey(
RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey key = baseKey.OpenSubKey("Software", false);
object value = key.GetValue("");
如果您的应用程序/服务将在32位计算机上运行,即使您要求RegistryView.Registry64
您也将始终获得常规注册表。 在64位计算机上运行时,您将始终获得注册表的正常版本(= 64位版本)。
附带问题:为什么需要将应用程序编译为X86或X64? 不能简单地保留AnyCPU?
虚拟化的目的不同,它并不是要将注册表与32位应用程序分开,而是要增强与传统应用程序的兼容性,我们都希望64位本机应用程序将以正确的方式使用注册表。 要访问注册表的非虚拟版本,您必须使用REG_KEY_DONT_VIRTUALIZE
标志打开注册表项。 不能在Microsoft.Win32
类中使用此标志,因此必须DllImport
它们和P / Invoke。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.