我有一个简单的安装程序,它根据已安装应用程序的主exe文件的Environment.Is64BitOperatingSystem和ProcessorArchitecture选择安装文件夹和注册表配置单元。例如。如果ProcessorArchitecture是MSIL而Windows是64位,我知道应用程序将以64位执行,因此应该安装在" C:\ Program Files"和应用程序应该在Windows注册表上使用64位视图。
但我在使用set build flag Prefer-32bit在.NET framework 4.5中编译的程序集时遇到问题。像这样的应用程序将作为32位进程在64位系统上运行,因此它应该存储在" Program Files(x86)"夹。但是,此应用程序的ProcessorArchitecture仍将是MSIL,因此我的决策算法将失败。是否有可能从汇编中获得Prefer-32bit标志?
由于
答案 0 :(得分:0)
Module.GetPEKind方法返回包含Preferred32Bit值的PortableExecutableKinds标志。
Assembly assembly = Assembly.LoadFile(file);
Module manifest = assembly.ManifestModule;
PortableExecutableKinds kind;
ImageFileMachine platform;
manifest.GetPEKind(out kind, out platform);
if((kind & PortableExecutableKinds.Preferred32Bit) != 0)
{
//is Prefer-32bit
}
答案 1 :(得分:0)
像这样的应用程序将在64位系统上运行,作为32位进程和 因此它应该存储在" Program Files(x86)"文件夹中。
请注意,AnyCPU可执行文件将按照请求的任何内容运行。的可能的即可。
它可以作为32位或64位运行,因此可以说一个应该在一个文件夹中,或者不是,有点奇怪。即使启用了 preffered32bit ,也不意味着它将作为32位进程运行。
如果您的64位应用程序启动您的AnyCPU应用程序,它将运行64位进程(因为没有其他选项 - 否则它会崩溃)。
有些架构甚至不支持32位仿真(ARM处理器),因此" 首选32位"不会做太多。
除非有充分的理由,我建议您保持简单,并将AnyCPU
程序集安装到C:\ Program Files(x86)文件夹。它将更加可维护和更容易理解。
从技术上讲,如果您使用PEInspect或类似的程序,AnyCPU程序集被标记为32bit
个程序(您将看到它们被标记为32位,下划线,如同这样,将它们放到ProgramFilesFolder目录是正确的)。
" AnyCPU"概念是在.NET框架的帮助下内部实现的。