2 using System.Reflection;
\r
3 using System.Xml.Serialization;
\r
5 namespace NaGet.Packages
\r
8 /// PlatformのOSの種類をあらわす
\r
10 public enum PlatformOSType : ushort
\r
27 public class Platform
\r
33 public ProcessorArchitecture Arch = ProcessorArchitecture.X86;
\r
39 public PlatformOSType[] OsType;
\r
47 if (OsType == null) return null;
\r
48 string[] strs = new string[OsType.Length];
\r
49 for (int i = 0; i < OsType.Length; i++) {
\r
50 strs[i] = OsType[i].ToString("G");
\r
52 return string.Join(",", strs);
\r
55 string[] strs = (value ?? string.Empty).Split(',');
\r
56 System.Collections.Generic.List<PlatformOSType> list = new System.Collections.Generic.List<PlatformOSType>();
\r
57 for (int i = 0; i < strs.Length; i++) {
\r
59 list.Add((PlatformOSType) Enum.Parse(typeof(PlatformOSType), strs[i], true));
\r
60 } catch (ArgumentException) {
\r
64 OsType = list.ToArray();
\r
69 /// 現在のプラットホームで動くか否か?
\r
71 /// <returns>動く場合はtrue</returns>
\r
72 public bool IsRunnable()
\r
74 return IsRunnableArch() && IsRunnableOS();
\r
78 /// 現在のマシンのアーキテクチャで動くか否か?
\r
80 /// <returns>動く場合はtrue</returns>
\r
81 public bool IsRunnableArch()
\r
83 return Arch == GetArch() ||
\r
84 Arch == ProcessorArchitecture.None ||
\r
85 Arch == ProcessorArchitecture.MSIL;
\r
89 /// 現在のマシンのアーキテクチャで動かないが、Wow64で動くか否か?
\r
90 /// 64ビット環境でない場合は常にfalse
\r
92 /// <returns></returns>
\r
93 public bool IsRunnableArchOnWow64()
\r
95 if (IntPtr.Size == 8) {
\r
96 return Arch == ProcessorArchitecture.X86;
\r
103 /// 現在のマシンのアーキテクチャを得る
\r
105 /// <returns>現在のマシンのアーキテクチャ</returns>
\r
106 public static ProcessorArchitecture GetArch()
\r
108 Module[] moduleArray = Assembly.GetExecutingAssembly().GetModules();
\r
109 Module md = moduleArray[0];
\r
111 PortableExecutableKinds pekinds;
\r
112 ImageFileMachine ifm;
\r
113 md.GetPEKind(out pekinds, out ifm);
\r
116 case ImageFileMachine.AMD64:
\r
117 return ProcessorArchitecture.Amd64;
\r
118 case ImageFileMachine.I386:
\r
119 return (IntPtr.Size == 4)? ProcessorArchitecture.X86 : ProcessorArchitecture.Amd64;
\r
120 case ImageFileMachine.IA64:
\r
121 return ProcessorArchitecture.IA64;
\r
123 return ProcessorArchitecture.None;
\r
130 /// <returns>現在のマシンで動くか</returns>
\r
131 public bool IsRunnableOS()
\r
133 if (OsType == null || OsType.Length <= 0) {
\r
134 return true; // 記述なしはOS全部で動く扱い
\r
137 PlatformOSType? thisOs = GetOSType();
\r
139 return thisOs != null && Array.BinarySearch(OsType, (PlatformOSType) thisOs) >= 0;
\r
145 /// <returns>現在のマシンのOS</returns>
\r
146 public static PlatformOSType? GetOSType()
\r
148 OperatingSystem os = Environment.OSVersion;
\r
149 Version osVer = os.Version;
\r
151 switch (os.Platform) {
\r
152 case PlatformID.Win32Windows:
\r
153 if (osVer.Major == 4) {
\r
154 switch (osVer.Minor) {
\r
156 return PlatformOSType.WIN95;
\r
158 return PlatformOSType.WIN98;
\r
160 return PlatformOSType.WINME;
\r
164 case PlatformID.Win32NT:
\r
165 if (osVer.Major == 4) {
\r
166 return PlatformOSType.WINNT4;
\r
167 } else if (osVer.Major == 5) {
\r
168 switch (osVer.Minor) {
\r
170 return PlatformOSType.WIN2K;
\r
172 return PlatformOSType.WINXP;
\r
174 return PlatformOSType.WIN2003;
\r
176 } else if (osVer.Major == 6) {
\r
177 int osVerMinor = osVer.Minor;
\r
178 NaGet.InteropServices.WindowsVersion.VersionInfo? verInfo = NaGet.InteropServices.WindowsVersion.GetVersionInfo();
\r
179 if (verInfo.HasValue) {
\r
180 osVerMinor = (int) verInfo.Value.MinorVersion;
\r
182 switch (osVerMinor) {
\r
184 return PlatformOSType.VISTA;
\r
186 return PlatformOSType.WIN7;
\r
188 return PlatformOSType.WIN8;
\r
190 return PlatformOSType.WIN8_1;
\r
192 return PlatformOSType.WIN10;
\r
196 // case PlatformID.WinCE:
\r
198 // case PlatformID.Unix:
\r