1

我有一个解决方案,其中可执行文件的目标平台最初设置为x86,许多其他项目设置为 AnyCPU,并在 .Net 3.5 中包含 3 个项目(其他所有项目为 .Net 4.0)。我想这就是安装程序写入HKEY_LOCAL_MACHINE\SOFTWARE注册表项的原因。

最近,我修复了一些问题,现在所有项目都是 .Net 4.0。此外,我将可执行目标平台设置为 AnyCPU。我发现应用程序现在安装在HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node.

[侧边栏 - 我们有 p/invokes -DllImport属性 - 没有指定CallingConvention. 当这在托管和非托管代码中都被修改为指定Cdecl__cdecl时,我们能够将依赖项目升级到 .Net 4.0 而不会收到PInvokeStackImbalance异常。]

我们目前在 Windows 7(64 位)机器上使用 VS2010 进行开发。我的问题是:安装程序\SOFTWARE\ 最初是否写信是因为某些项目是 .Net 3.5?

此外,如果此应用程序打算安装在 WindowsXP(预计支持 32 位)机器上,注册表项是否有问题?更好的是,我应该在构建选项中寻找什么来确保在 WinXp 32 位系统上的兼容性?

4

1 回答 1

1

只有 64 位安装程序才能避免在 64 位操作系统上使用 Wow6432Node。在由安装程序的 TargetPlatform 属性设置的安装项目中,它默认为“x86”。如果您将 C# EXE 项目的目标平台更改为 AnyCPU,请将其更改为“x64”。这也将确保您的程序安装到 c:\program files 而不是 c:\program files (x86)。

因此,您需要维护两个安装程序。有点头疼,您可以通过将 C# EXE 项目的目标平台设置为 x86 来避免它,这样安装程序和您的程序都可以访问 Wow6432Node 中的密钥。

pinvoke 问题通常是相反的,64 位代码只有一个调用约定,cdecl 和 stdcall 之间没有区别。

于 2012-07-23T16:54:58.273 回答