您的位置:首页 > 其它

Win64 注册表重定机制向导致程序运行异常

2008-12-06 15:38 232 查看
前一段时间,软件安装包制作完成,在32位机器上部署、运行正常,但移到服务器上(Win2003 64bit),运行时提示找不到注册表项。
为在Win64中能够运行Win32程序,引入了WoW64(Windows-on-Windows 64-bit)技术。
参考:维基百科WOW64

WoW64技术会对Win32程序的部分文件、注册表进行重定向:
1.文件
Program Files Program Files (x86)
%Systemroot%\System32 %Systemroot%\SysWOW64

2.注册表
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER\Software\Classes
HKEY_LOCAL_MACHINE\Software
HKEY_USERS\*\Software\Classes
HKEY_USERS\*_Classes
32bit程序操作这些注册表项都自动重定向到他的\SysWOW64子项下。

文件和注册表重定向是系统自动维护的。疑问:既然系统自动维护重定向,程序应该正常。
我们的托管程序的编译选项是Any CPU。IL代码并无32bit和64bit之分,在win32下当作32bit程序,win64中当作64bit程序。
安装包是在Win32下做的,安装包负责写注册表,托管程序去读注册表,问题就出在这,Win64把安装包当作32为程序,对其进行的注册表操作进行了重定向,而读的时候却没有进行相应的重定向。
安装包使用wix做的,加上选项,把写注册表这个模块作为64bit程序运行,阻止其重定向即可。

<Component Id='XXX0' Guid='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' Win64='yes'>
<Registry Id ='XXX1' Root='HKLM' Key='SOFTWARE\XXXXXX' Name='XXX' Action='write' Type='string' Value='XXXXXX' />
</Component>
其他解决方法是可以将键值写到一个系统不会进行重定向的项或判断平台,根据平台取相应的键值。
当然,最好是少使用甚至不用注册表,过分依赖注册表违背.NET设计的初衷。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐