Tôi muốn kiểm tra cấu trúc CPU nào mà người dùng đang chạy, là i386 hoặc X64 hoặc AMD64. Tôi muốn làm điều đó trong C#. Tôi biết tôi có thể thử WMI hoặc Registry. Có cách nào khác ngoài hai điều này không? Mục tiêu dự án của tôi .NET 2.0!Xác định loại kiến trúc CPU bằng cách sử dụng C#
Trả lời
Bạn cũng có thể thử (chỉ hoạt động nếu nó không phải thao tác):
System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")
Bạn có thể hỏi người dùng?
Chỉ đùa thôi ... Tôi nghĩ WMI là thứ bạn sẽ sử dụng cho điều đó. Nhưng có lẽ có một số cách khác không?
Nếu bạn đi đến WMI thì LinqToWmi có thể được sử dụng. Tôi đã thử nó một lần, và nó có vẻ khá thẳng về phía trước =) ->http://www.codeplex.com/linq2wmi
Win32_Processor WMI Class sẽ thực hiện công việc. Sử dụng MgmtClassGen.exe để tạo trình bao bọc được nhập mạnh mẽ.
Đây có lẽ là câu trả lời hay nhất cho câu hỏi. –
Điều này đã giúp tôi rất nhiều! cảm ơn và +1! –
Lớp Win32_Processor có nhiệm vụ giúp đỡ như thế nào? nếu bạn đang nói về OSArchitecture, thì thuộc tính này không có sẵn trên hầu hết các phiên bản Windows, chỉ một vài phiên bản mới nhất hỗ trợ nó. – ivan
lẽ this bài viết CodeProject có thể giúp đỡ? Nó sử dụng ManagementObjectSearcher trong không gian tên System.Management để tìm kiếm thông tin phần cứng.
Tôi tin rằng bạn nên tránh sưng tấy nặng như WMI và LINQ .. và bạn sẽ phải cuối cùng, để có thêm thông tin khi bạn đi cùng, không ai trong số đó hài lòng bởi apis cồng kềnh và khung công tác.
Chỉ cần gọi một dll gọi và trích xuất thông tin CPUID. C++/CLI hoặc pinvoke sẽ làm và nhận tất cả thông tin bạn cần trên nhà cung cấp. Trước tiên, bạn cần xem hướng dẫn có được hỗ trợ hay không (99% thời gian).
Để bắt đầu và chạy nhanh, hãy kiểm tra trang web intel để tìm mẫu wincpuid và trích xuất mẫu từ cpuid.h từ đó. Chỉ có 2 nhà cung cấp và một nhà cung cấp là tốt với độ trễ của bộ nhớ và một cái khác không phải là (như mã gốc so với mã được quản lý). Vì vậy, bạn sẽ có vấn đề với Mono trên kiến trúc khác, vv (người không btw). Đối với x64 bạn đã biết nó hay chỉ nhận được CorFlags (mình đã có và giết chết ổ đĩa của bạn khách hàng khó với phân phối NET) ..
(http://software.intel.com/en-us/articles/api-detects-ia-32-and-x64-platform-cpu-characteristics/)
Cảm ơn bạn đã lồng tiếng cho tư tưởng Tôi đã có (mà gợi ra một tiếng rên) khi tôi đọc các gợi ý của việc sử dụng WMI. –
Liên kết của bạn với intel.com hiện đã bị chết. –
Dưới đây là những gì tôi đã làm:
public static bool Isx86()
{
return (Environment.ExpandEnvironmentVariables("%ProgramFiles(x86)%").Length == 0);
}
Nếu bạn đang sử dụng kiến trúc 64 bit, bạn sẽ có hai biến tập tin chương trình. Nếu bạn đang ở trên x86, bạn sẽ chỉ có một.
Xấu xí, nếu tất cả những gì bạn quan tâm là 32 bit so với 64 bit còn gọi là x86 vs x64, chỉ cần sử dụng thuộc tính BCL sau đây Environment.Is64BitOperatingSystem –
Điều này có vẻ đơn giản với tôi:
System.Environment.Is64BitOperatingSystem
nó có sẵn trong .NET 4.0 trong khi câu hỏi là về .NET 2.0 – ivan
gì dẫn tôi ở đây là kiểm tra cho một hệ điều hành 32 vs 64 bit. câu trả lời được đánh giá cao nhất đang xem cài đặt cho Quy trình hiện tại. Sau khi không tìm thấy câu trả lời, tôi đã tìm thấy cài đặt sau. Hy vọng điều này làm việc cho bạn.
bool is64 = System.Environment.Is64BitOperatingSystem
Chỉ được hỗ trợ trong .NET Framework 4+ –
Xin lỗi để hồi sinh một chuỗi cũ, nhưng như một lời khuyên cho người đọc trong tương lai: vì một quy trình 32 bit có thể chạy trên hệ điều hành 64 bit, 'System.Environment.Is64BitProcess' hữu ích hơn trong trường hợp của tôi (đặt' Biến PATH' cho "sqlite3.dll" chính xác dựa trên kiến trúc). Hệ điều hành thực sự là 64-bit trong trường hợp của tôi, nhưng vì một thư viện khác tôi đã phải biên dịch ứng dụng của tôi như là 32-bit. – nurchi
Is64BitProcess không xuất hiện cho đến ít nhất là phiên bản 4. Đối với bất kỳ phiên bản nào, tôi nghĩ IntPtr.Size là giải pháp thanh lịch nhất; Tôi quấn một biểu thức thứ ba xung quanh nó trong đoạn mã đã đưa tôi đến trang này. –
Dưới đây là một đoạn mã mà dường như để làm việc (dựa trên P/Invoke):
public static ProcessorArchitecture GetProcessorArchitecture()
{
SYSTEM_INFO si = new SYSTEM_INFO();
GetNativeSystemInfo(ref si);
switch (si.wProcessorArchitecture)
{
case PROCESSOR_ARCHITECTURE_AMD64:
return ProcessorArchitecture.Amd64;
case PROCESSOR_ARCHITECTURE_IA64:
return ProcessorArchitecture.IA64;
case PROCESSOR_ARCHITECTURE_INTEL:
return ProcessorArchitecture.X86;
default:
return ProcessorArchitecture.None; // that's weird :-)
}
}
với
[DllImport("kernel32.dll")]
private static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSystemInfo);
private const int PROCESSOR_ARCHITECTURE_AMD64 = 9;
private const int PROCESSOR_ARCHITECTURE_IA64 = 6;
private const int PROCESSOR_ARCHITECTURE_INTEL = 0;
[StructLayout(LayoutKind.Sequential)]
private struct SYSTEM_INFO
{
public short wProcessorArchitecture;
public short wReserved;
public int dwPageSize;
public IntPtr lpMinimumApplicationAddress;
public IntPtr lpMaximumApplicationAddress;
public IntPtr dwActiveProcessorMask;
public int dwNumberOfProcessors;
public int dwProcessorType;
public int dwAllocationGranularity;
public short wProcessorLevel;
public short wProcessorRevision;
}
Lưu ý mã này reuses ProcessorArchitecture enum CLR hiện có của, và hỗ trợ .NET framework 2 và cao hơn.
Cảm ơn tác phẩm tuyệt vời này ... Tôi hy vọng Loại máy không phải là loại hệ điều hành. –
Simon, đây là giải pháp gọn gàng nhất được cung cấp. Mọi người sợ Platform Invoke, vượt qua nó; nó không (thường) cắn! –
Cuối cùng lừa ngắn nhất để giải quyết các kiến trúc nền tảng/xử lý cho thời gian chạy chạy CLR hiện tại trong C# là:
PortableExecutableKinds peKind;
ImageFileMachine machine;
typeof(object).Module.GetPEKind(out peKind, out machine);
Đây Module.GetPEKind trả về một ImageFileMachine liệt kê, mà tồn tại kể từ NET v2:
public enum ImageFileMachine
{
I386 = 0x014C,
IA64 = 0x0200,
AMD64 = 0x8664,
ARM = 0x01C4 // new in .NET 4.5
}
Tại sao không sử dụng new AssemblyName(fullName)
hoặc typeof(object).Assembly.GetName()
?
Vâng có này HACK
bình trong mã nguồn ASP.NET MVC (từ 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);
}
Xem họ sử dụng một số thủ thuật ẩn cho bản thân. Đáng buồn thay, hàm tạo AssemblyName
không đặt trường ProcessorArchitecture
một cách thích hợp, nó chỉ là None
cho bất kỳ AssemblyName mới nào.
Vì vậy, đối với người đọc trong tương lai, hãy để tôi khuyên bạn nên sử dụng GetPEKind xấu xí đó bằng ImageFileMachine!
Ghi chú:
- này trả về dòng điện chạy kiến trúc thời gian chạy, không phải là kiến trúc hệ thống cơ bản!
Điều đó nói rằng, ngoại lệ duy nhất là thời gian chạy I386 có thể chạy trên hệ thống AMD64. - Được thử nghiệm trên mono/ubuntu 14.04/AMD64 và .NET/Win7/I386.
Tùy thuộc vào lý do bạn muốn biết, bạn có thể thấy rằng việc kiểm tra kích thước của cấu trúc IntPtr là cách dễ nhất.
Tôi thích cách Coward ẩn danh nghĩ! –
Tôi biết rằng câu hỏi này là từ quá khứ, nhưng kể từ năm 2017, hiện nay là một phương pháp đơn giản để biết kiến trúc của quá trình hiện tại, trong tiêu chuẩn .net:
System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture
Các giá trị trả về là một trong các X86, X64, ARM, ARM64 và cung cấp kiến trúc về quy trình đang chạy. OSArchitecture
trả về kiến trúc của hệ điều hành đã cài đặt thay thế.
Liên kết đến các tài liệu (khá vô dụng mặc dù ...):
RuntimeInformation.ProcessArchitecture: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.runtimeinformation.processarchitecture?view=netstandard-1.4
Kiến trúc liệt kê: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.architecture?view=netstandard-1.4
Làm thế nào về điều này?
switch (typeof(string).Assembly.GetName().ProcessorArchitecture) {
case System.Reflection.ProcessorArchitecture.X86:
break;
case System.Reflection.ProcessorArchitecture.Amd64:
break;
case System.Reflection.ProcessorArchitecture.Arm:
break;
}
Tuy nhiên case *.Arm:
chưa được thử nghiệm.
nếu nó không được thiết lập thì sao? –
Không được đặt thành trường hợp "thao tác" (ít nhất là trên Vista, nó được đặt theo mặc định). Tôi đề nghị nó như là một cách thay thế, không nhất thiết phải là cách tốt nhất. Tuy nhiên, –
là câu trả lời hay. –