从程序集中获取prefer-32bit标志的值

时间:2014-11-08 13:39:25

标签: c# .net .net-assembly

我有一个简单的安装程序,它根据已安装应用程序的主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标志?

由于

2 个答案:

答案 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框架的帮助下内部实现的。