Наконец, самый короткий трюк для определения архитектуры платформы / процессора для текущей рабочей среды CLR в C #:
PortableExecutableKinds peKind;
ImageFileMachine machine;
typeof(object).Module.GetPEKind(out peKind, out machine);
Здесь Module.GetPEKind возвращает перечисление ImageFileMachine , которое существует с .NET v2:
public enum ImageFileMachine
{
I386 = 0x014C,
IA64 = 0x0200,
AMD64 = 0x8664,
ARM = 0x01C4 // new in .NET 4.5
}
Почему бы не использовать new AssemblyName(fullName)
или typeof(object).Assembly.GetName()
?
Ну, есть HACK
комментарий в исходном коде ASP.NET MVC (начиная с 1.0):
private static string GetMvcVersionString() {
// DevDiv 216459:
// This code originally used Assembly.GetName(), but that requires FileIOPermission, which isn't granted in
// medium trust. However, Assembly.FullName *is* accessible in medium trust.
return new AssemblyName(typeof(MvcHttpHandler).Assembly.FullName).Version.ToString(2);
}
Видите, они используют некоторые скрытые трюки для себя. К сожалению, конструктор AssemblyName
не устанавливает поле ProcessorArchitecture
надлежащим образом, он просто None
для любого нового AssemblyName.
Итак, для будущих читателей позвольте мне порекомендовать вам использовать этот уродливый GetPEKind с ImageFileMachine!
Примечания:
- Возвращает текущую работающую архитектуру времени выполнения , а не базовую архитектуру системы!
Тем не менее, единственным исключением является то, что среда выполнения I386 может работать в системе AMD64.
- Протестировано на mono / ubuntu 14.04 / AMD64 и .NET / Win7 / I386.