Xác định hệ điều hành trong .NET Core


118

Làm cách nào để xác định hệ điều hành mà ứng dụng .NET Core của tôi đang chạy? Trong quá khứ tôi có thể sử dụng Environment.OSVersion.

Cách hiện tại để xác định xem ứng dụng của tôi đang chạy trên Mac hay Windows là gì?



Không thực sự là câu trả lời tôi đang tìm kiếm, nhưng tự mình tìm thấy nó.
dknaack

Tham khảo bài viết này codepedia.info/ từ
Satinder singh

Câu trả lời:


184

phương pháp

System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()

Đối số có thể

OSPlatform.Windows
OSPlatform.OSX
OSPlatform.Linux

Thí dụ

bool isWindows = System.Runtime.InteropServices.RuntimeInformation
                                               .IsOSPlatform(OSPlatform.Windows);

Cập nhật

Cảm ơn bình luận của Oleksii Vynnychenko

Bạn có thể lấy tên và phiên bản của hệ điều hành dưới dạng chuỗi bằng cách sử dụng

var osNameAndVersion = System.Runtime.InteropServices.RuntimeInformation.OSDescription;

Ví dụ như osNameAndVersionsẽ làMicrosoft Windows 10.0.10586


4
Bạn có thể thêm rằng để có thêm thông tin về HĐH, có một thuộc tính khác trong gói đó: System.Runtime.InteropServices.RuntimeInformation.OSDescription- trả về mô tả của HĐH với phiên bản, v.v.
Oleksii Vynnychenko

15
+1 mặc dù tôi không thích câu trả lời này. Tại sao họ không thể thực hiện System.Environment.OSVersion.Platformcho thống nhất?
leppie

2
Lưu ý rằng các hằng số không đại diện cho tất cả các hệ điều hành được hỗ trợ. Có thể thăm dò các HĐH khác bằng cách sử dụng IsOSPlatform(OSPlatform.Create("FreeBSD"))liệu chúng có được hỗ trợ ngay bây giờ hay có thể được thêm vào trong tương lai. Tuy nhiên, không rõ ràng cách tiếp cận an toàn sẽ là gì đối với chuỗi nào sẽ vượt qua (ví dụ: trường hợp nào quan trọng hoặc không "bsd"khớp với cả hai "FreeBSD""NetBSD"?). Xem thảo luận về tính năng này ở đây .
NightOwl888

37

System.Environment.OSVersion.Platform có thể được sử dụng trong .NET Framework và Mono đầy đủ nhưng:

  • Phát hiện Mac OS X gần như không bao giờ làm việc với tôi dưới Mono
  • nó không được triển khai trong .NET Core

System.Runtime.InteropServices.RuntimeInformation có thể được sử dụng trong .NET Core nhưng:

  • nó không được triển khai trong .NET Framework và Mono đầy đủ
  • nó không thực hiện phát hiện nền tảng trong thời gian chạy mà thay vào đó sử dụng thông tin được mã hóa cứng
    (xem vấn đề corefx # 3032 để biết thêm chi tiết)

Bạn có thể xác định các chức năng không được quản lý cụ thể của nền tảng như uname():

  • nó có thể gây ra lỗi phân khúc trên các nền tảng không xác định
  • không được phép trong một số dự án

Vì vậy, giải pháp được đề xuất của tôi (xem mã dưới đây) có thể trông có vẻ ban đầu nhưng:

  • nó sử dụng mã được quản lý 100%
  • nó hoạt động trong .NET, Mono và .NET Core
  • nó hoạt động như một bùa mê cho đến nay trong thư viện LOLcs11Interop
string windir = Environment.GetEnvironmentVariable("windir");
if (!string.IsNullOrEmpty(windir) && windir.Contains(@"\") && Directory.Exists(windir))
{
    _isWindows = true;
}
else if (File.Exists(@"/proc/sys/kernel/ostype"))
{
    string osType = File.ReadAllText(@"/proc/sys/kernel/ostype");
    if (osType.StartsWith("Linux", StringComparison.OrdinalIgnoreCase))
    {
        // Note: Android gets here too
        _isLinux = true;
    }
    else
    {
        throw new UnsupportedPlatformException(osType);
    }
}
else if (File.Exists(@"/System/Library/CoreServices/SystemVersion.plist"))
{
    // Note: iOS gets here too
    _isMacOsX = true;
}
else
{
    throw new UnsupportedPlatformException();
}

1
Đánh giá cao cho nỗ lực của bạn. Mong muốn có thể có một số nhất quán trong tương lai.
leppie

6
System.R.78.InteropService.R.78In information sẽ hoạt động chính xác trong toàn bộ .net ngay bây giờ (kể từ tháng 11), vì vậy đó dường như là cách "đúng" được chấp nhận ngay bây giờ. Không chắc chắn về đơn âm, nhưng vì họ đang lấy một số mã trực tiếp từ .net bây giờ là nguồn mở, nên vấn đề chỉ là thời gian trước khi nó hoạt động ở đó, nếu chưa.
GrandOpener

1
Path.DirectorySeparatorChar Có thể được sử dụng để xác định xem đó là máy windows hay * nix.
kiran

Dịch vụ InteropS rất lạ. Trong VStudio và Rider, đôi khi tôi nhận được "Không xác định trong ngữ cảnh này" hoặc nó biên dịch. Không biết về lý do của sự thất bại này ...
Slesa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.