Skip to content

Commit 726892f

Browse files
committed
v2.0
use [MethodImpl(MethodImplOptions.AggressiveInlining)]
1 parent a163efe commit 726892f

17 files changed

+331
-143
lines changed

OperatingSystem2.android.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Xamarin.Essentials;
77
#endif
88
using System.Runtime.Versioning;
9+
using System.Runtime.CompilerServices;
910

1011
namespace System
1112
{
@@ -15,7 +16,8 @@ partial class OperatingSystem2
1516
/// 指示当前应用程序是否正在 Android 上运行。
1617
/// </summary>
1718
[SupportedOSPlatformGuard("android")]
18-
public static bool IsAndroid =>
19+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
20+
public static bool IsAndroid() =>
1921
#if __ANDROID__
2022
true;
2123
#elif NET5_0 || NET6_0 || NET7_0
@@ -47,7 +49,8 @@ partial class OperatingSystem2
4749
/// 指示当前应用程序是否正在 Windows Subsystem for Android™️ 上运行。
4850
/// </summary>
4951
[SupportedOSPlatformGuard("android")]
50-
public static bool IsRunningOnWSA =>
52+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
53+
public static bool IsRunningOnWSA() =>
5154
#if __ANDROID__
5255
_IsRunningOnWSA.Value;
5356
#else
@@ -60,6 +63,7 @@ partial class OperatingSystem2
6063
/// <param name="sdkInt"></param>
6164
/// <returns></returns>
6265
[SupportedOSPlatformGuard("android")]
66+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
6367
public static bool IsAndroidVersionAtLeast(int sdkInt)
6468
{
6569
#if __ANDROID__
@@ -76,6 +80,7 @@ public static bool IsAndroidVersionAtLeast(int sdkInt)
7680
/// <param name="sdkInt"></param>
7781
/// <returns></returns>
7882
[SupportedOSPlatformGuard("android")]
83+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
7984
public static bool IsAndroidVersionAtLeast(BuildVersionCodes sdkInt)
8085
{
8186
return Build.VERSION.SdkInt >= sdkInt;
@@ -91,14 +96,15 @@ public static bool IsAndroidVersionAtLeast(BuildVersionCodes sdkInt)
9196
/// <param name="revision"></param>
9297
/// <returns></returns>
9398
[SupportedOSPlatformGuard("android")]
99+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
94100
public static bool IsAndroidVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0)
95101
{
96102
#if NET5_0 || NET6_0 || NET7_0
97103
return OperatingSystem.IsAndroidVersionAtLeast(major, minor, build, revision);
98104
#elif __HAVE_XAMARIN_ESSENTIALS__
99105
return
100106
#if !__ANDROID__
101-
IsAndroid &&
107+
IsAndroid() &&
102108
#endif
103109
IsVersionAtLeast(DeviceInfo.Version, major, minor, build, revision);
104110
#else

OperatingSystem2.application.cs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Collections.Generic;
22
using System.Linq;
3+
using System.Runtime.CompilerServices;
34

45
namespace System
56
{
@@ -87,22 +88,28 @@ public static class Types
8788
}
8889

8990
/// <inheritdoc cref="TypeNames.Avalonia"/>
90-
public static bool UseAvalonia => Types.Avalonia != null;
91+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
92+
public static bool UseAvalonia() => Types.Avalonia != null;
9193

9294
/// <inheritdoc cref="TypeNames.XamarinForms"/>
93-
public static bool UseXamarinForms => Types.XamarinForms != null;
95+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
96+
public static bool UseXamarinForms() => Types.XamarinForms != null;
9497

9598
/// <inheritdoc cref="TypeNames.Maui"/>
96-
public static bool UseMaui => Types.Maui != null;
99+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
100+
public static bool UseMaui() => Types.Maui != null;
97101

98102
/// <inheritdoc cref="TypeNames.WindowsForms"/>
99-
public static bool UseWindowsForms => Types.WindowsForms != null;
103+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
104+
public static bool UseWindowsForms() => Types.WindowsForms != null;
100105

101106
/// <inheritdoc cref="TypeNames.WPF"/>
102-
public static bool UseWPF => Types.WPF != null;
107+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
108+
public static bool UseWPF() => Types.WPF != null;
103109

104110
/// <inheritdoc cref="TypeNames.Uno"/>
105-
public static bool UseUno => Types.Uno != null;
111+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
112+
public static bool UseUno() => Types.Uno != null;
106113
}
107114
}
108115
}

OperatingSystem2.browser.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Runtime.InteropServices;
33
#endif
44
using System.Runtime.Versioning;
5+
using System.Runtime.CompilerServices;
56

67
namespace System
78
{
@@ -11,7 +12,8 @@ partial class OperatingSystem2
1112
/// 指示当前应用程序是否在浏览器中作为 WASM 运行。
1213
/// </summary>
1314
[SupportedOSPlatformGuard("browser")]
14-
public static bool IsBrowser =>
15+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
16+
public static bool IsBrowser() =>
1517
#if NET5_0 || NET6_0 || NET7_0
1618
OperatingSystem.IsBrowser();
1719
#elif __HAVE_RUNTIME_INFORMATION__

OperatingSystem2.cs

Lines changed: 15 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#if WINDOWS_UWP
66
using Windows.System.Profile;
77
#endif
8+
using System.Runtime.CompilerServices;
89

910
namespace System
1011
{
@@ -14,6 +15,7 @@ namespace System
1415
public static partial class OperatingSystem2
1516
{
1617
#if __HAVE_XAMARIN_ESSENTIALS__ || (!NET5_0 && !NET6_0 && !NET7_0)
18+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1719
static int GetInt32(int value) => value < 0 ? 0 : value;
1820

1921
static bool IsVersionAtLeast(int major_left, int minor_left, int build_left, int revision_left, int major_right, int minor_right, int build_right, int revision_right)
@@ -48,83 +50,37 @@ static bool IsVersionAtLeast(Version version_left, int major_right = 0, int mino
4850
/// <summary>
4951
/// 当前是否使用 Mono 运行时。
5052
/// </summary>
51-
public static bool IsRunningOnMono { get; } =
53+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
54+
public static bool IsRunningOnMono()
55+
{
5256
#if __XAMARIN_ANDROID_v1_0__ || XAMARIN_MAC || XAMARIN_IOS || XAMARIN_WATCHOS || XAMARIN_TVOS
53-
true;
57+
return true;
5458
#else
55-
Type.GetType("Mono.Runtime") != null;
59+
return IsRunningOnMono_;
5660
#endif
61+
}
5762

58-
#if !WINDOWS_UWP && !(NETSTANDARD1_0 || NETSTANDARD1_1 || NET35 || NET40)
59-
static byte isAvaloniaDesktop;
60-
#endif
61-
static bool IsDesktop_()
62-
{
63-
#if WINDOWS_UWP
64-
return AnalyticsInfo.VersionInfo.DeviceFamily == "Windows.Desktop";
63+
#if __XAMARIN_ANDROID_v1_0__ || XAMARIN_MAC || XAMARIN_IOS || XAMARIN_WATCHOS || XAMARIN_TVOS
6564
#else
66-
#if __HAVE_XAMARIN_ESSENTIALS__
67-
var idiom = DeviceInfo.Idiom;
68-
if (idiom == DeviceIdiom.Desktop) return true;
69-
if (idiom != DeviceIdiom.Unknown) return false;
70-
#endif
71-
if (Application.UseWindowsForms || Application.UseWPF)
72-
{
73-
return true;
74-
}
75-
#if !(NETSTANDARD1_0 || NETSTANDARD1_1 || NET35 || NET40)
76-
else if (Application.UseAvalonia)
77-
{
78-
if (isAvaloniaDesktop == 0)
79-
{
80-
try
81-
{
82-
var currentAvaloniaApplication = Application.Types.Avalonia!.GetProperty("Current", BindingFlags.Static | BindingFlags.Public)?.GetValue(null);
83-
if (currentAvaloniaApplication != null)
84-
{
85-
var applicationLifetime = Application.Types.Avalonia.GetProperty("ApplicationLifetime", BindingFlags.Instance | BindingFlags.Public)?.GetValue(currentAvaloniaApplication);
86-
if (applicationLifetime != null)
87-
{
88-
if (applicationLifetime.GetType().ToString().Contains("Desktop"))
89-
{
90-
isAvaloniaDesktop = 1;
91-
}
92-
}
93-
}
94-
}
95-
catch
96-
{
97-
isAvaloniaDesktop = 2;
98-
}
99-
}
100-
return isAvaloniaDesktop == 1;
101-
}
65+
static bool IsRunningOnMono_ { get; } = Type.GetType("Mono.Runtime") != null;
10266
#endif
103-
return false;
104-
#endif
105-
}
106-
107-
/// <summary>
108-
/// 指示当前应用程序是否正在 Desktop 上运行。
109-
/// </summary>
110-
public static bool IsDesktop =>
111-
_IsDesktop.Value;
112-
static readonly Lazy<bool> _IsDesktop = new(IsDesktop_);
11367

11468
/// <summary>
11569
/// 指示当前应用程序是否正在仅支持应用商店的平台上运行。
11670
/// </summary>
117-
public static bool IsOnlySupportedStore =>
71+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
72+
public static bool IsOnlySupportedStore() =>
11873
#if NETFRAMEWORK || __MACOS__ || NET5_0_WINDOWS || NET6_0_WINDOWS || NET7_0_WINDOWS || __ANDROID__
11974
false;
12075
#else
121-
IsIOS || IsWatchOS || IsTvOS;
76+
IsIOS() || IsWatchOS() || IsTvOS();
12277
#endif
12378

12479
/// <summary>
12580
/// 获取当前系统版本号。
12681
/// </summary>
127-
public static Version Version =>
82+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
83+
public static Version Version() =>
12884
#if NETSTANDARD1_0
12985
throw new PlatformNotSupportedException();
13086
#elif NETSTANDARD1_1 || WINDOWS_UWP

OperatingSystem2.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<Project Sdk="MSBuild.Sdk.Extras">
22

33
<PropertyGroup>
4-
<TargetFrameworks>net6.0;net6.0-windows;net6.0-macos10.14;net6.0-android;net6.0-ios;net6.0-maccatalyst;net5.0;net5.0-windows;netcoreapp3.0;netcoreapp3.1;netstandard1.0;netstandard1.1;netstandard2.0;MonoAndroid11.0;Xamarin.iOS10;Xamarin.TVOS10;Xamarin.WatchOS10;Xamarin.Mac20</TargetFrameworks>
5-
<TargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">$(TargetFrameworks);net35;net40;net471;uap10.0.19041;</TargetFrameworks>
4+
<TargetFrameworks>net6.0;net6.0-windows;net6.0-macos;net6.0-android;net6.0-ios;net6.0-maccatalyst;net5.0;net5.0-windows;netcoreapp3.0;netcoreapp3.1;netstandard1.0;netstandard1.1;netstandard2.0;MonoAndroid12.0;Xamarin.iOS10;Xamarin.TVOS10;Xamarin.WatchOS10;Xamarin.Mac20</TargetFrameworks>
5+
<TargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">$(TargetFrameworks);net35;net40;net45;net471;uap10.0.19041;</TargetFrameworks>
66
<AssemblyName>System.OperatingSystem2</AssemblyName>
77
<RootNamespace>System</RootNamespace>
88
<LangVersion>9.0</LangVersion>
@@ -21,7 +21,7 @@
2121
<Description>表示有关操作系统的信息,如版本和平台标识符的通用库。</Description>
2222
<PackageId>OperatingSystem2</PackageId>
2323
<GenerateDocumentationFile>true</GenerateDocumentationFile>
24-
<Version>1.4.3</Version>
24+
<Version>2.0.0</Version>
2525
<AndroidUseIntermediateDesignerFile>false</AndroidUseIntermediateDesignerFile>
2626
<DisableImplicitNamespaceImports>true</DisableImplicitNamespaceImports>
2727
<PublishRepositoryUrl>true</PublishRepositoryUrl>
@@ -39,7 +39,7 @@
3939
</PropertyGroup>
4040

4141
<ItemGroup Condition=" $(TargetFramework.StartsWith('netstandard')) OR $(TargetFramework.StartsWith('MonoAndroid')) OR $(TargetFramework.StartsWith('Xamarin')) ">
42-
<PackageReference Include="Xamarin.Essentials" Version="1.7.0" />
42+
<PackageReference Include="Xamarin.Essentials" Version="1.7.3" />
4343
</ItemGroup>
4444

4545
<ItemGroup>

OperatingSystem2.desktop.cs

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
using System.Reflection;
2+
#if __HAVE_XAMARIN_ESSENTIALS__
3+
using Xamarin.Essentials;
4+
#endif
5+
#if WINDOWS_UWP
6+
using Windows.System.Profile;
7+
#endif
8+
using System.Runtime.CompilerServices;
9+
10+
namespace System
11+
{
12+
partial class OperatingSystem2
13+
{
14+
#if !WINDOWS_UWP && !(NETSTANDARD1_0 || NETSTANDARD1_1 || NET35 || NET40 || NET45)
15+
static byte isAvaloniaDesktop;
16+
#endif
17+
static EDesktopType GetDesktopType()
18+
{
19+
#if WINDOWS_UWP
20+
if (AnalyticsInfo.VersionInfo.DeviceFamily == "Windows.Desktop")
21+
return EDesktopType.WindowsDesktop;
22+
#else
23+
#if __HAVE_XAMARIN_ESSENTIALS__
24+
var idiom = DeviceInfo.Idiom;
25+
if (idiom == DeviceIdiom.Desktop) return EDesktopType.DeviceIdiomDesktop;
26+
if (idiom != DeviceIdiom.Unknown) return EDesktopType.Unknown;
27+
#endif
28+
if (Application.UseWindowsForms() || Application.UseWPF())
29+
{
30+
return EDesktopType.WinFormsOrWPF;
31+
}
32+
#if !(NETSTANDARD1_0 || NETSTANDARD1_1 || NET35 || NET40 || NET45)
33+
else if (Application.UseAvalonia())
34+
{
35+
if (isAvaloniaDesktop == 0)
36+
{
37+
try
38+
{
39+
var currentAvaloniaApplication = Application.Types.Avalonia!.GetProperty("Current", BindingFlags.Static | BindingFlags.Public)?.GetValue(null);
40+
if (currentAvaloniaApplication != null)
41+
{
42+
var applicationLifetime = Application.Types.Avalonia.GetProperty("ApplicationLifetime", BindingFlags.Instance | BindingFlags.Public)?.GetValue(currentAvaloniaApplication);
43+
if (applicationLifetime != null)
44+
{
45+
if (applicationLifetime.GetType().ToString().Contains("Desktop"))
46+
{
47+
isAvaloniaDesktop = 1;
48+
}
49+
}
50+
}
51+
}
52+
catch
53+
{
54+
isAvaloniaDesktop = 2;
55+
}
56+
}
57+
if (isAvaloniaDesktop == 1)
58+
{
59+
return EDesktopType.AvaloniaDesktop;
60+
}
61+
}
62+
#endif
63+
#endif
64+
return EDesktopType.Unknown;
65+
}
66+
67+
/// <summary>
68+
/// 指示当前应用程序是否正在 Desktop 上运行。
69+
/// </summary>
70+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
71+
public static bool IsDesktop() => DesktopType != EDesktopType.Unknown;
72+
73+
/// <summary>
74+
///
75+
/// </summary>
76+
public static EDesktopType DesktopType =>
77+
_DesktopType.Value;
78+
static readonly Lazy<EDesktopType> _DesktopType = new(GetDesktopType);
79+
80+
/// <summary>
81+
///
82+
/// </summary>
83+
public enum EDesktopType
84+
{
85+
/// <summary>
86+
///
87+
/// </summary>
88+
Unknown,
89+
90+
/// <summary>
91+
/// UWP(Windows.Desktop)
92+
/// </summary>
93+
WindowsDesktop,
94+
95+
/// <summary>
96+
///
97+
/// </summary>
98+
WinFormsOrWPF,
99+
100+
/// <summary>
101+
///
102+
/// </summary>
103+
AvaloniaDesktop,
104+
105+
/// <summary>
106+
///
107+
/// </summary>
108+
DeviceIdiomDesktop,
109+
}
110+
}
111+
}

0 commit comments

Comments
 (0)