C# 从程序集获取Prefere-32位标志的值

C# 从程序集获取Prefere-32位标志的值,c#,.net,.net-assembly,C#,.net,.net Assembly,我有一个简单的安装程序,它根据Environment.Is64BitOperatingSystem和Processor选择了要安装的文件夹和注册表配置单元。安装的应用程序的主exe文件的结构是。例如,如果ProcessorArchitecture为MSIL,Windows为64位,我知道应用程序将以64位执行,因此应安装在“C:\Program Files”中,应用程序应使用Windows注册表上的64位视图 但我对在.NETFramework 4.5中编译的带有set build标志Prefe

我有一个简单的安装程序,它根据Environment.Is64BitOperatingSystem和Processor选择了要安装的文件夹和注册表配置单元。安装的应用程序的主exe文件的结构是。例如,如果ProcessorArchitecture为MSIL,Windows为64位,我知道应用程序将以64位执行,因此应安装在“C:\Program Files”中,应用程序应使用Windows注册表上的64位视图

但我对在.NETFramework 4.5中编译的带有set build标志Prefer-32位的程序集有问题。这样的应用程序将作为32位进程在64位系统上运行,因此它应该存储在“ProgramFiles(x86)”文件夹中。然而,这个应用程序的ProcessorArchitecture仍然是MSIL,所以我的决策算法将失败。是否可以从程序集获取Prefere-32位标志

感谢

方法返回包含Preferred32位值的标志

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
}
这样的应用程序将在64位系统上作为32位进程和 因此,它应该存储在“ProgramFiles(x86)”文件夹中

请注意,任何CPU可执行文件都将按要求运行&可能的

它可以作为32位或64位运行,因此说一个人应该在一个文件夹中,或者不在一个文件夹中,有点奇怪。即使启用了prefered32bit,也不意味着它将作为32位进程运行

如果您的64位应用程序启动您的AnyCPU应用程序,它将运行64位进程(因为没有其他选项-否则它将崩溃)

有些体系结构甚至不支持32位仿真(ARM处理器),因此“更喜欢32位””就没什么用了

除非有非常好的理由,我建议您保持简单,并将
AnyCPU
程序集安装到C:\Program Files(x86)文件夹中。它将更易于维护和理解

Ps,从技术上讲,如果您使用PEInspect或类似的程序,任何CPU程序集都标记为32位的(您会看到它们标记为32位,pedump,因此,将它们放在ProgramFilesFolder目录中是正确的)

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