2 using System.Reflection;
\r
3 using System.Xml.Serialization;
\r
5 namespace NaGet.Packages
\r
8 /// PlatformのOSの種類をあらわす
\r
10 public enum PlatformOSType
\r
24 public class Platform
\r
30 public ProcessorArchitecture Arch = ProcessorArchitecture.X86;
\r
36 public PlatformOSType[] OsType;
\r
44 if (OsType == null) return null;
\r
45 string[] strs = new string[OsType.Length];
\r
46 for (int i = 0; i < OsType.Length; i++) {
\r
47 strs[i] = OsType[i].ToString("G");
\r
49 return string.Join(",", strs);
\r
52 string[] strs = (value ?? "").Split(',');
\r
53 System.Collections.Generic.List<PlatformOSType> list = new System.Collections.Generic.List<PlatformOSType>();
\r
54 for (int i = 0; i < strs.Length; i++) {
\r
56 list.Add((PlatformOSType) Enum.Parse(typeof(PlatformOSType), strs[i], true));
\r
57 } catch (ArgumentException) {
\r
60 OsType = list.ToArray();
\r
65 /// 現在のプラットホームで動くか否か?
\r
67 /// <returns>動く場合はtrue</returns>
\r
68 public bool IsRunnable()
\r
70 return IsRunnableArch() && IsRunnableOS();
\r
74 /// 現在のマシンのアーキテクチャで動くか否か?
\r
76 /// <returns>動く場合はtrue</returns>
\r
77 public bool IsRunnableArch()
\r
79 return Arch == GetArch() ||
\r
80 Arch == ProcessorArchitecture.None ||
\r
81 Arch == ProcessorArchitecture.MSIL;
\r
85 /// 現在のマシンのアーキテクチャで動かないが、Wow64で動くか否か?
\r
86 /// 64ビット環境でない場合は常にfalse
\r
88 /// <returns></returns>
\r
89 public bool IsRunnableArchOnWow64()
\r
91 if (IntPtr.Size == 8) {
\r
92 return Arch == ProcessorArchitecture.X86;
\r
99 /// 現在のマシンのアーキテクチャを得る
\r
101 /// <returns>現在のマシンのアーキテクチャ</returns>
\r
102 public static ProcessorArchitecture GetArch()
\r
104 Module[] moduleArray = Assembly.GetExecutingAssembly().GetModules();
\r
105 Module md = moduleArray[0];
\r
107 PortableExecutableKinds pekinds;
\r
108 ImageFileMachine ifm;
\r
109 md.GetPEKind(out pekinds, out ifm);
\r
112 case ImageFileMachine.AMD64:
\r
113 return ProcessorArchitecture.Amd64;
\r
114 case ImageFileMachine.I386:
\r
115 return (IntPtr.Size == 4)? ProcessorArchitecture.X86 : ProcessorArchitecture.Amd64;
\r
116 case ImageFileMachine.IA64:
\r
117 return ProcessorArchitecture.IA64;
\r
119 return ProcessorArchitecture.None;
\r
124 /// 現在のマシンのアーキテクチャを得る
\r
126 /// <returns>現在のマシンのアーキテクチャ</returns>
\r
127 public bool IsRunnableOS()
\r
129 if (OsType == null || OsType.Length <= 0) {
\r
130 return true; // 記述なしはOS全部で動く扱い
\r
133 PlatformOSType? thisOs = GetOSType();
\r
134 return thisOs != null && Array.BinarySearch(OsType, (PlatformOSType) thisOs) >= 0;
\r
140 /// <returns>現在のマシンのOS</returns>
\r
141 public static PlatformOSType? GetOSType()
\r
143 OperatingSystem os = Environment.OSVersion;
\r
144 Version osVer = os.Version;
\r
146 switch (os.Platform) {
\r
147 case PlatformID.Win32Windows:
\r
148 if (osVer.Major == 4) {
\r
149 switch (osVer.Minor) {
\r
151 return PlatformOSType.WIN95;
\r
153 return PlatformOSType.WIN98;
\r
155 return PlatformOSType.WINME;
\r
159 case PlatformID.Win32NT:
\r
160 if (osVer.Major == 4) {
\r
161 return PlatformOSType.WINNT4;
\r
162 } else if (osVer.Major == 5) {
\r
163 switch (osVer.Minor) {
\r
165 return PlatformOSType.WIN2K;
\r
167 return PlatformOSType.WINXP;
\r
169 return PlatformOSType.WIN2003;
\r
171 } else if (osVer.Major == 6) {
\r
172 switch (osVer.Minor) {
\r
174 return PlatformOSType.VISTA;
\r
176 return PlatformOSType.WIN2008;
\r
180 // case PlatformID.WinCE:
\r
182 // case PlatformID.Unix:
\r