2014-11-08 49 views
0

我有一个基于Environment.Is64BitOperatingSystem和ProcessorArchitecture的安装应用程序的主exe文件选择了文件夹安装和注册表配置单元的简单安装程序。例如。如果ProcessorArchitecture是MSIL和Windows是64位我知道应用程序将被执行为64位,因此它应该安装在“C:\ Program Files文件”和应用程序应该使用Windows注册表的64位视图。从程序集中获取prefer-32bit标志的值

但我有问题与程序集编译在.NET框架4.5与设置构建标志首选-32位。像这样的应用程序将作为32位进程在64位系统上运行,因此它应该存储在“Program Files(x86)”文件夹中。但是,此应用程序的ProcessorArchitecture将仍然是MSIL,因此我的决策算法将失败。是否有可能从程序集中获得Prefer-32bit标志?

由于

回答

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 
} 
0

喜欢这个应用程序将64位系统上运行32位的进程和 因此应该存储在“程序文件(x86)”文件夹中。

注意AnyCPU可执行程序将运行作为任何请求& 可能的

它可以运行为32位或64位,因此可以说一个应该在一个文件夹中,或不是,有点奇怪。即使preffered32bit已启用,但这并不意味着它将作为32位进程运行。

如果您的64位应用程序启动您的AnyCPU应用程序,它将运行64位进程(因为没有其他选项 - 否则它会崩溃)。一些体系结构甚至不支持32位仿真(ARM处理器),例如“首选32位”不会有太大的作用。

除非有疯狂的很好的理由,我建议你让事情变得简单,并安装AnyCPU组件到C:\ Program Files文件(x86)的文件夹。这将更易于理解。

PS,技术上,AnyCPU组件被标记为32bit的,如果你使用PEInspect或similiar程序(你会看到它们被标记32位,pedump,正因为如此,这将是正确的给他们派上ProgramFilesFolder目录)。

“AnyCPU”概念是在.NET框架的帮助下内部实现的。