Compare commits

..
1 Commits
Author SHA1 Message Date
Aigio Liu 149d8a9d41 publish msstore v2.6.9 2022-04-09 19:33:32 +08:00
639 changed files with 15960 additions and 21265 deletions
+1 -190
View File
@@ -17,7 +17,7 @@ charset = utf-8
[Makefile]
indent_style = tab
[*.{js,json,xaml,axaml,xml,resx,resw,csproj,wapproj,appxmanifest,props}]
[*.{js,json,xaml,axaml,xml,resx,resw,csproj,wapproj,appxmanifest,.props}]
indent_style = space
indent_size = 2
@@ -240,192 +240,3 @@ dotnet_style_namespace_match_folder = false
# IDE0130: 命名空间与文件夹结构不匹配
dotnet_diagnostic.IDE0130.severity = none
# IDE0055: 修正格式
dotnet_diagnostic.IDE0055.severity = error
# IDE1006: 命名样式
dotnet_diagnostic.IDE1006.severity = error
# SA1600: Elements should be documented
dotnet_diagnostic.SA1600.severity = none
# SA1629: Documentation text should end with a period
dotnet_diagnostic.SA1629.severity = silent
# SA1101: Prefix local calls with this
dotnet_diagnostic.SA1101.severity = silent
# SA1623: Property summary documentation should match accessors
dotnet_diagnostic.SA1623.severity = none
# SA1200: Using directives should be placed correctly
dotnet_diagnostic.SA1200.severity = none
# SA1208: System using directives should be placed before other using directives
dotnet_diagnostic.SA1208.severity = silent
# Default severity for analyzer diagnostics with category 'StyleCop.CSharp.LayoutRules'
dotnet_analyzer_diagnostic.category-StyleCop.CSharp.LayoutRules.severity = error
# SA1400: Access modifier should be declared
dotnet_diagnostic.SA1400.severity = silent
# SA1633: File should have header
dotnet_diagnostic.SA1633.severity = silent
# SA1128: Put constructor initializers on their own line
dotnet_diagnostic.SA1128.severity = silent
# SA1413: Use trailing comma in multi-line initializers
dotnet_diagnostic.SA1413.severity = suggestion
# SA1005: Single line comments should begin with single space
dotnet_diagnostic.SA1005.severity = none
# SA1515: Single-line comment should be preceded by blank line
dotnet_diagnostic.SA1515.severity = silent
# SA1512: Single-line comments should not be followed by blank line
dotnet_diagnostic.SA1512.severity = silent
# SA1122: Use string.Empty for empty strings
dotnet_diagnostic.SA1122.severity = silent
# SA1616: Element return value documentation should have text
dotnet_diagnostic.SA1616.severity = silent
# SA1310: Field names should not contain underscore
dotnet_diagnostic.SA1310.severity = silent
# SA1137: Elements should have the same indentation
dotnet_diagnostic.SA1137.severity = error
# SA1503: Braces should not be omitted
dotnet_diagnostic.SA1503.severity = silent
# SA1513: Closing brace should be followed by blank line
dotnet_diagnostic.SA1513.severity = silent
# SA1402: File may only contain a single type
dotnet_diagnostic.SA1402.severity = silent
# SA1133: Do not combine attributes
dotnet_diagnostic.SA1133.severity = silent
# SA1011: Closing square brackets should be spaced correctly
dotnet_diagnostic.SA1011.severity = silent
# SA1502: Element should not be on a single line
dotnet_diagnostic.SA1502.severity = silent
# SA1201: Elements should appear in the correct order
dotnet_diagnostic.SA1201.severity = silent
# SA1505: Opening braces should not be followed by blank line
dotnet_diagnostic.SA1505.severity = silent
# SA1508: Closing braces should not be preceded by blank line
dotnet_diagnostic.SA1508.severity = silent
# SA1614: Element parameter documentation should have text
dotnet_diagnostic.SA1614.severity = silent
# SA1116: Split parameters should start on line after declaration
dotnet_diagnostic.SA1116.severity = silent
# SA1601: Partial elements should be documented
dotnet_diagnostic.SA1601.severity = silent
# SA1009: Closing parenthesis should be spaced correctly
dotnet_diagnostic.SA1009.severity = silent
# SA1202: Elements should be ordered by access
dotnet_diagnostic.SA1202.severity = silent
# SA1311: Static readonly fields should begin with upper-case letter
dotnet_diagnostic.SA1311.severity = silent
# SA1127: Generic type constraints should be on their own line
dotnet_diagnostic.SA1127.severity = silent
# SA1503: Braces should not be omitted
dotnet_diagnostic.SA1503.severity = silent
# SA1649: File name should match first type name
dotnet_diagnostic.SA1649.severity = silent
# SA1210: Using directives should be ordered alphabetically by namespace
dotnet_diagnostic.SA1210.severity = silent
# SA1028: Code should not contain trailing whitespace
dotnet_diagnostic.SA1028.severity = silent
# SA1204: Static elements should appear before instance elements
dotnet_diagnostic.SA1204.severity = silent
# SA1203: Constants should appear before fields
dotnet_diagnostic.SA1203.severity = silent
# SA1123: Do not place regions within elements
dotnet_diagnostic.SA1123.severity = silent
# SA1615: Element return value should be documented
dotnet_diagnostic.SA1615.severity = silent
# SA1611: Element parameters should be documented
dotnet_diagnostic.SA1611.severity = silent
# SA1124: Do not use regions
dotnet_diagnostic.SA1124.severity = silent
# SA1520: Use braces consistently
dotnet_diagnostic.SA1520.severity = silent
# SA1107: Code should not contain multiple statements on one line
dotnet_diagnostic.SA1107.severity = silent
# SA1312: Variable names should begin with lower-case letter
dotnet_diagnostic.SA1312.severity = error
# SA1519: Braces should not be omitted from multi-line child statement
dotnet_diagnostic.SA1519.severity = silent
# SA1000: Keywords should be spaced correctly
dotnet_diagnostic.SA1000.severity = silent
# SA1205: Partial elements should declare access
dotnet_diagnostic.SA1205.severity = silent
# SA1401: Fields should be private
dotnet_diagnostic.SA1401.severity = silent
# SA1622: Generic type parameter documentation should have text
dotnet_diagnostic.SA1622.severity = silent
# SA1627: Documentation text should not be empty
dotnet_diagnostic.SA1627.severity = silent
# SA1403: File may only contain a single namespace
dotnet_diagnostic.SA1403.severity = silent
# SA1602: Enumeration items should be documented
dotnet_diagnostic.SA1602.severity = silent
# SA1108: Block statements should not contain embedded comments
dotnet_diagnostic.SA1108.severity = silent
# SA1642: Constructor summary documentation should begin with standard text
dotnet_diagnostic.SA1642.severity = silent
# SA1117: Parameters should be on same line or separate lines
dotnet_diagnostic.SA1117.severity = silent
# SA1501: Statement should not be on a single line
dotnet_diagnostic.SA1501.severity = silent
# SA1500: Braces for multi-line statements should not share line
dotnet_diagnostic.SA1500.severity = silent
# SA1518: Use line endings correctly at end of file
dotnet_diagnostic.SA1518.severity = silent
+12 -21
View File
@@ -17,8 +17,7 @@ jobs:
fail-fast: false
matrix:
configuration: [ Debug, Release ]
# os: [ windows-latest, macOS-latest, ubuntu-latest ]
os: [ windows-latest, macOS-latest ]
os: [ windows-latest, macOS-latest, ubuntu-latest ]
# rid: [ fd-win-x64, win-x64, osx-x64, linux-x64,linux-arm64 ]
steps:
@@ -41,17 +40,9 @@ jobs:
if: matrix.os == 'windows-latest'
run: dotnet workload install macos
- name: Install Android SDK(Unix)
if: ${{ matrix.os == 'macOS-latest' || matrix.os == 'ubuntu-latest' }}
run: sudo dotnet workload install android
- name: Install Android SDK(Windows)
- name: Install Maui(Windows)
if: matrix.os == 'windows-latest'
run: dotnet workload install android
# - name: Install Maui(Windows)
# if: matrix.os == 'windows-latest'
# run: dotnet workload install maui
run: dotnet workload install maui
- name: Verify dotnet info
run: dotnet --info
@@ -95,9 +86,9 @@ jobs:
- name: Run ST.Client.Desktop.UnitTest
run: dotnet test ./tests/ST.Client.Desktop.UnitTest/ST.Client.Desktop.UnitTest.csproj -c "${{ matrix.configuration }}"
- name: dotnet ST.Client.Desktop.UnitTest test
if: matrix.os != 'windows-latest'
run: dotnet test ./tests/ST.Client.Desktop.UnitTest/ST.Client.Desktop.UnitTest.csproj
# - name: dotnet ST.Client.Desktop.UnitTest test
# if: matrix.os != 'windows-latest'
# run: dotnet test ./tests/ST.Client.Desktop.UnitTest/ST.Client.Desktop.UnitTest.csproj
- name: Get Short CommitId
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
@@ -126,7 +117,7 @@ jobs:
- name: Upload fd-win-x64 App ${{ matrix.configuration }}
continue-on-error: true
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v2
with:
name: '[${{ matrix.configuration }}]${{ env.ProjectName }}_win_x64_fde_${{ env.GITHUB_SHA_SHORT }}'
path: src\ST.Client.Desktop.Avalonia.App\bin\${{ matrix.configuration }}\Publish\${{ env.ProjectName }}_win_x64_fde_${{ env.GITHUB_SHA_SHORT }}.7z
@@ -134,7 +125,7 @@ jobs:
- name: Upload win-x64 App ${{ matrix.configuration }}
continue-on-error: true
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v2
with:
name: '[${{ matrix.configuration }}]${{ env.ProjectName }}_win_x64_${{ env.GITHUB_SHA_SHORT }}'
path: src\ST.Client.Desktop.Avalonia.App\bin\${{ matrix.configuration }}\Publish\${{ env.ProjectName }}_win_x64_${{ env.GITHUB_SHA_SHORT }}.7z
@@ -142,7 +133,7 @@ jobs:
- name: Upload macos-x64 App ${{ matrix.configuration }}
continue-on-error: true
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v2
with:
name: '[${{ matrix.configuration }}]${{ env.ProjectName }}_macos_x64_${{ env.GITHUB_SHA_SHORT }}'
path: src\ST.Client.Desktop.Avalonia.App\bin\${{ matrix.configuration }}\Publish\${{ env.ProjectName }}_macos_x64_${{ env.GITHUB_SHA_SHORT }}.7z
@@ -150,7 +141,7 @@ jobs:
- name: Upload macos-arm64 App ${{ matrix.configuration }}
continue-on-error: true
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v2
with:
name: '[${{ matrix.configuration }}]${{ env.ProjectName }}_macos_arm64_${{ env.GITHUB_SHA_SHORT }}'
path: src\ST.Client.Desktop.Avalonia.App\bin\${{ matrix.configuration }}\Publish\${{ env.ProjectName }}_macos_arm64_${{ env.GITHUB_SHA_SHORT }}.7z
@@ -158,7 +149,7 @@ jobs:
- name: Upload linux-x64 App ${{ matrix.configuration }}
continue-on-error: true
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v2
with:
name: '[${{ matrix.configuration }}]${{ env.ProjectName }}_linux_x64_${{ env.GITHUB_SHA_SHORT }}'
path: src\ST.Client.Desktop.Avalonia.App\bin\${{ matrix.configuration }}\Publish\${{ env.ProjectName }}_linux_x64_${{ env.GITHUB_SHA_SHORT }}.tar.zst
@@ -166,7 +157,7 @@ jobs:
- name: Upload linux-arm64 App ${{ matrix.configuration }}
continue-on-error: true
if: ${{ matrix.os == 'windows-latest' && !startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' }}
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v2
with:
name: '[${{ matrix.configuration }}]${{ env.ProjectName }}_linux_arm64_${{ env.GITHUB_SHA_SHORT }}'
path: src\ST.Client.Desktop.Avalonia.App\bin\${{ matrix.configuration }}\Publish\${{ env.ProjectName }}_linux_arm64_${{ env.GITHUB_SHA_SHORT }}.tar.zst
+255 -273
View File
@@ -1,313 +1,295 @@
<Project>
<ItemGroup Condition=" $(TargetFramework.StartsWith('net6.0')) ">
<!-- Microsoft.Extensions.* & AspNetCore & EntityFrameworkCore(NET60) -->
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.AzureAppServices" Version="6.0.4" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.4" />
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="6.0.4" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.4" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.4" />
<PackageVersion Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.4" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.4" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.4" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Version="6.0.4" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="6.0.4" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="6.0.4" />
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('net5.0')) ">
<!-- Microsoft.Extensions.* & AspNetCore & EntityFrameworkCore(NET50) -->
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="5.0.2" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="5.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="5.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="5.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.AzureAppServices" Version="5.0.16" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.16" />
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="5.0.14" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="5.0.16" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.16" />
<PackageVersion Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="5.0.16" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.16" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.16" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Version="5.0.16" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="5.0.16" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="5.0.16" />
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('netstandard')) Or $(TargetFramework.StartsWith('netcoreapp3.1'))">
<!-- Microsoft.Extensions.* & AspNetCore & EntityFrameworkCore(NETCOREAPP31) -->
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="3.1.24" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="3.1.24" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="3.1.24" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="3.1.24" />
<PackageVersion Include="Microsoft.Extensions.Logging.AzureAppServices" Version="3.1.24" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.24" />
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="3.1.24" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.24" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.24" />
<PackageVersion Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.24" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.24" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.24" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Version="3.1.24" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="3.1.24" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.24" />
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('net6.0')) ">
<!-- Entity Framework Plus -->
<!-- A FREE & Open Source library to enhance EF6 and EF Core -->
<PackageVersion Include="Z.EntityFramework.Plus.EFCore" Version="6.13.17" />
<ItemGroup Condition=" $(TargetFramework.StartsWith('net6.0')) ">
<!-- Microsoft.Extensions.* & AspNetCore & EntityFrameworkCore(NET60) -->
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.AzureAppServices" Version="6.0.2" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.2" />
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="6.0.2" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.2" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Version="6.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="6.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="6.0.2" />
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('net5.0')) ">
<!-- Microsoft.Extensions.* & AspNetCore & EntityFrameworkCore(NET50) -->
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="5.0.12" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="5.0.12" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="5.0.12" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="5.0.12" />
<PackageVersion Include="Microsoft.Extensions.Logging.AzureAppServices" Version="5.0.14" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.14" />
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="5.0.14" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="5.0.14" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.14" />
<PackageVersion Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="5.0.14" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.14" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.14" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Version="5.0.14" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="5.0.14" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="5.0.14" />
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('netstandard')) Or $(TargetFramework.StartsWith('netcoreapp3.1'))">
<!-- Microsoft.Extensions.* & AspNetCore & EntityFrameworkCore(NETCOREAPP31) -->
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="3.1.22" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="3.1.22" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="3.1.22" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="3.1.22" />
<PackageVersion Include="Microsoft.Extensions.Logging.AzureAppServices" Version="3.1.22" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.22" />
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="3.1.22" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.22" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.22" />
<PackageVersion Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.22" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.22" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.22" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Version="3.1.22" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="3.1.22" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.22" />
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('net6.0')) ">
<!-- Entity Framework Plus -->
<!-- A FREE & Open Source library to enhance EF6 and EF Core -->
<PackageVersion Include="Z.EntityFramework.Plus.EFCore" Version="6.13.12" />
<!-- AspNetCore 6 OpenId/OAuth -->
<PackageVersion Include="Microsoft.IdentityModel.Protocols" Version="6.17.0" />
<PackageVersion Include="AspNet.Security.OpenId.Steam" Version="6.0.0" />
<PackageVersion Include="AspNet.Security.OAuth.QQ" Version="6.0.6" />
<PackageVersion Include="AspNet.Security.OAuth.Apple" Version="6.0.6" />
</ItemGroup>
<ItemGroup>
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net48' Or '$(TargetFramework)' == 'net472' Or '$(TargetFramework)' == 'net471' Or '$(TargetFramework)' == 'net46' Or '$(TargetFramework)' == 'net462' Or '$(TargetFramework)' == 'net461' Or '$(TargetFramework)' == 'net45' Or '$(TargetFramework)' == 'net452' Or '$(TargetFramework)' == 'net451' ">
<!-- WindowsRuntime(NETFX) & PowerShell 5 -->
<PackageVersion Include="System.Runtime.WindowsRuntime" Version="4.7.0" />
<PackageVersion Include="System.Runtime.WindowsRuntime.UI.Xaml" Version="4.7.0" />
<PackageVersion Include="Microsoft.PowerShell.5.ReferenceAssemblies" Version="1.1.0" />
</ItemGroup>
<ItemGroup>
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('netstandard')) Or $(TargetFramework.StartsWith('net5.0')) Or $(TargetFramework.StartsWith('netcoreapp3.1')) Or $(TargetFramework.StartsWith('netcoreapp3.0')) Or $(TargetFramework.StartsWith('netcoreapp2.2')) Or $(TargetFramework.StartsWith('netcoreapp2.1')) Or $(TargetFramework.StartsWith('netcoreapp2.0')) ">
<!-- .NET Platform Extensions 5 -->
<PackageVersion Include="Microsoft.Win32.Registry" Version="5.0.0" />
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('netstandard')) ">
<!-- BCL(NETSTANDARD) -->
<PackageVersion Include="System.Text.Json" Version="6.0.2" />
<PackageVersion Include="System.Text.Encodings.Web" Version="6.0.0" />
<PackageVersion Include="System.Drawing.Common" Version="6.0.0" />
<PackageVersion Include="System.Security.Principal.Windows" Version="5.0.0" />
<PackageVersion Include="System.Buffers" Version="4.5.1" />
<PackageVersion Include="System.Memory" Version="4.5.4" />
<PackageVersion Include="System.Threading.Tasks.Extensions" Version="4.5.4" />
<PackageVersion Include="System.Diagnostics.Tracing" Version="4.3.0" />
</ItemGroup>
<ItemGroup>
<!-- Microsoft.* -->
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
<!--<PackageVersion Include="Microsoft.Windows.CsWinRT" Version="1.4.1" />-->
<!--<PackageVersion Include="Microsoft.Windows.SDK.NET.Ref" Version="10.0.19041.22" />-->
<!--<PackageVersion Include="Microsoft.Windows.SDK.Contracts" Version="10.0.19041.1" />-->
<PackageVersion Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22000.197" />
<!-- AspNetCore 6 OpenId/OAuth -->
<PackageVersion Include="AspNet.Security.OpenId.Steam" Version="6.0.0" />
<PackageVersion Include="AspNet.Security.OAuth.QQ" Version="6.0.4" />
<PackageVersion Include="AspNet.Security.OAuth.Apple" Version="6.0.4" />
</ItemGroup>
<ItemGroup>
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net48' Or '$(TargetFramework)' == 'net472' Or '$(TargetFramework)' == 'net471' Or '$(TargetFramework)' == 'net46' Or '$(TargetFramework)' == 'net462' Or '$(TargetFramework)' == 'net461' Or '$(TargetFramework)' == 'net45' Or '$(TargetFramework)' == 'net452' Or '$(TargetFramework)' == 'net451' ">
<!-- WindowsRuntime(NETFX) & PowerShell 5 -->
<PackageVersion Include="System.Runtime.WindowsRuntime" Version="4.7.0" />
<PackageVersion Include="System.Runtime.WindowsRuntime.UI.Xaml" Version="4.7.0" />
<PackageVersion Include="Microsoft.PowerShell.5.ReferenceAssemblies" Version="1.1.0" />
</ItemGroup>
<ItemGroup>
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('netstandard')) Or $(TargetFramework.StartsWith('net5.0')) Or $(TargetFramework.StartsWith('netcoreapp3.1')) Or $(TargetFramework.StartsWith('netcoreapp3.0')) Or $(TargetFramework.StartsWith('netcoreapp2.2')) Or $(TargetFramework.StartsWith('netcoreapp2.1')) Or $(TargetFramework.StartsWith('netcoreapp2.0')) ">
<!-- .NET Platform Extensions 5 -->
<PackageVersion Include="Microsoft.Win32.Registry" Version="5.0.0" />
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('netstandard')) ">
<!-- BCL(NETSTANDARD) -->
<PackageVersion Include="System.Text.Json" Version="6.0.2" />
<PackageVersion Include="System.Text.Encodings.Web" Version="6.0.0" />
<PackageVersion Include="System.Drawing.Common" Version="6.0.0" />
<PackageVersion Include="System.Security.Principal.Windows" Version="5.0.0" />
<PackageVersion Include="System.Buffers" Version="4.5.1" />
<PackageVersion Include="System.Memory" Version="4.5.4" />
<PackageVersion Include="System.Threading.Tasks.Extensions" Version="4.5.4" />
<PackageVersion Include="System.Diagnostics.Tracing" Version="4.3.0" />
</ItemGroup>
<ItemGroup>
<!-- Microsoft.* -->
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
<!--<PackageVersion Include="Microsoft.Windows.CsWinRT" Version="1.4.1" />-->
<!--<PackageVersion Include="Microsoft.Windows.SDK.NET.Ref" Version="10.0.19041.22" />-->
<!--<PackageVersion Include="Microsoft.Windows.SDK.Contracts" Version="10.0.19041.1" />-->
<PackageVersion Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22000.197" />
<!-- AppCenter.* -->
<PackageVersion Include="Microsoft.AppCenter" Version="4.5.0" />
<PackageVersion Include="Microsoft.AppCenter.Analytics" Version="4.5.0" />
<PackageVersion Include="Microsoft.AppCenter.Crashes" Version="4.5.0" />
<PackageVersion Include="Aigio.Avalonia.AppCenter" Version="4.5.0" />
<PackageVersion Include="Aigio.Avalonia.AppCenter.Analytics" Version="4.5.0" />
<PackageVersion Include="Aigio.Avalonia.AppCenter.Crashes" Version="4.5.0" />
<!--<PackageVersion Include="nor0x.AppCenter" Version="4.4.0-XMAC" />
<!-- AppCenter.* -->
<PackageVersion Include="Microsoft.AppCenter" Version="4.5.0" />
<PackageVersion Include="Microsoft.AppCenter.Analytics" Version="4.5.0" />
<PackageVersion Include="Microsoft.AppCenter.Crashes" Version="4.5.0" />
<PackageVersion Include="Aigio.Avalonia.AppCenter" Version="4.5.0" />
<PackageVersion Include="Aigio.Avalonia.AppCenter.Analytics" Version="4.5.0" />
<PackageVersion Include="Aigio.Avalonia.AppCenter.Crashes" Version="4.5.0" />
<!--<PackageVersion Include="nor0x.AppCenter" Version="4.4.0-XMAC" />
<PackageVersion Include="nor0x.AppCenter.Analytics" Version="4.4.0-XMAC" />
<PackageVersion Include="nor0x.AppCenter.Crashes" Version="4.4.0-XMAC" />-->
<!-- .NET Platform Extensions 6 -->
<PackageVersion Include="System.Security.Cryptography.ProtectedData" Version="6.0.0" />
<!-- .NET Platform Extensions 6 -->
<PackageVersion Include="System.Security.Cryptography.ProtectedData" Version="6.0.0" />
<!-- Xamarin -->
<PackageVersion Include="Xamarin.Essentials" Version="1.7.2" />
<!-- Xamarin.Forms -->
<PackageVersion Include="Xamarin.Forms" Version="5.0.0.2401" />
<PackageVersion Include="Xamarin.Forms.Visual.Material" Version="5.0.0.2401" />
<PackageVersion Include="Xam.Plugins.Forms.ImageCircle" Version="3.1.1.1-beta" />
<!-- Xamarin -->
<PackageVersion Include="Xamarin.Essentials" Version="1.7.1" />
<!-- Xamarin.Forms -->
<PackageVersion Include="Xamarin.Forms" Version="5.0.0.2337" />
<PackageVersion Include="Xamarin.Forms.Visual.Material" Version="5.0.0.2337" />
<PackageVersion Include="Xam.Plugins.Forms.ImageCircle" Version="3.1.1.1-beta" />
<!-- NUnit & NUnit.Xamarin & Moq -->
<PackageVersion Include="NUnit" Version="3.13.3" />
<PackageVersion Include="NUnit3TestAdapter" Version="4.2.1" />
<PackageVersion Include="nunit.xamarin" Version="3.6.1" />
<PackageVersion Include="PCLStorage" Version="1.0.2" />
<PackageVersion Include="Moq" Version="4.17.2" />
<!-- NUnit & NUnit.Xamarin & Moq -->
<PackageVersion Include="NUnit" Version="3.13.2" />
<PackageVersion Include="NUnit3TestAdapter" Version="4.2.1" />
<PackageVersion Include="nunit.xamarin" Version="3.6.1" />
<PackageVersion Include="PCLStorage" Version="1.0.2" />
<PackageVersion Include="Moq" Version="4.17.1" />
<!-- NLog -->
<PackageVersion Include="NLog" Version="4.7.15" />
<PackageVersion Include="NLog.Extensions.Logging" Version="1.7.4" />
<PackageVersion Include="NLog.Web.AspNetCore" Version="4.14.0" />
<PackageVersion Include="AspNetCore2.NETStandard.NLog.Web.AspNetCore" Version="4.14.0" />
<!-- NLog -->
<PackageVersion Include="NLog" Version="4.7.14" />
<PackageVersion Include="NLog.Extensions.Logging" Version="1.7.4" />
<PackageVersion Include="NLog.Web.AspNetCore" Version="4.14.0" />
<!-- ReactiveUI -->
<PackageVersion Include="System.Reactive" Version="5.0.0" />
<PackageVersion Include="Splat" Version="14.2.8" />
<PackageVersion Include="DynamicData" Version="7.6.7" />
<PackageVersion Include="ReactiveUI" Version="18.0.7" />
<!--<PackageVersion Include="ReactiveUI.Fody" Version="17.1.50" /> -->
<PackageVersion Include="ReactiveUI.XamForms" Version="18.0.7" />
<PackageVersion Include="ReactiveUI.AndroidX" Version="18.0.7" />
<!-- ReactiveUI -->
<PackageVersion Include="System.Reactive" Version="5.0.0" />
<PackageVersion Include="Splat" Version="14.1.45" />
<PackageVersion Include="DynamicData" Version="7.5.4" />
<PackageVersion Include="ReactiveUI" Version="17.1.50" />
<!--<PackageVersion Include="ReactiveUI.Fody" Version="17.1.50" /> -->
<PackageVersion Include="ReactiveUI.XamForms" Version="17.1.50" />
<PackageVersion Include="ReactiveUI.AndroidX" Version="17.1.50" />
<!-- SkiaSharp & HarfBuzzSharp -->
<PackageVersion Include="HarfBuzzSharp" Version="2.8.2-preview.254" />
<PackageVersion Include="HarfBuzzSharp.NativeAssets.Linux" Version="2.8.2-preview.254" />
<PackageVersion Include="SkiaSharp" Version="2.88.0-preview.254" />
<PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="2.88.0-preview.254" />
<!-- SkiaSharp & HarfBuzzSharp -->
<PackageVersion Include="HarfBuzzSharp" Version="2.8.2-preview.187" />
<PackageVersion Include="HarfBuzzSharp.NativeAssets.Linux" Version="2.8.2-preview.187" />
<PackageVersion Include="SkiaSharp" Version="2.88.0-preview.187" />
<PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="2.88.0-preview.187" />
<!-- AutoMapper -->
<PackageVersion Include="AutoMapper" Version="10.1.1" />
<PackageVersion Include="AutoMapper.Collection" Version="7.0.1" />
<PackageVersion Include="AutoMapper.Collection.EntityFrameworkCore" Version="7.1.3" />
<PackageVersion Include="AutoMapper.Extensions.ExpressionMapping" Version="4.1.5" />
<PackageVersion Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="8.1.1" />
<!-- AutoMapper -->
<PackageVersion Include="AutoMapper" Version="10.1.1" />
<PackageVersion Include="AutoMapper.Collection" Version="7.0.1" />
<PackageVersion Include="AutoMapper.Collection.EntityFrameworkCore" Version="7.1.3" />
<PackageVersion Include="AutoMapper.Extensions.ExpressionMapping" Version="4.1.3" />
<PackageVersion Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="8.1.1" />
<!-- QRCode -->
<!--<PackageVersion Include="QRCoder" Version="1.4.2" />-->
<PackageVersion Include="Net.Codecrete.QrCodeGenerator" Version="2.0.1" />
<!-- QRCode -->
<!--<PackageVersion Include="QRCoder" Version="1.4.2" />-->
<PackageVersion Include="Net.Codecrete.QrCodeGenerator" Version="2.0.1" />
<!-- NotifyIcon -->
<PackageVersion Include="NotifyIcon.Base" Version="1.0.5.1" />
<!--<PackageVersion Include="NotifyIcon.Linux" Version="1.0.5.1" />-->
<!--<PackageVersion Include="NotifyIcon.Mac" Version="1.0.5.1" />-->
<PackageVersion Include="NotifyIcon.Windows" Version="1.0.5.1" />
<!--<PackageVersion Include="GtkSharp" Version="3.24.24.34" />-->
<!-- NotifyIcon -->
<PackageVersion Include="NotifyIcon.Base" Version="1.0.5.1" />
<!--<PackageVersion Include="NotifyIcon.Linux" Version="1.0.5.1" />-->
<!--<PackageVersion Include="NotifyIcon.Mac" Version="1.0.5.1" />-->
<PackageVersion Include="NotifyIcon.Windows" Version="1.0.5.1" />
<!--<PackageVersion Include="GtkSharp" Version="3.24.24.34" />-->
<!-- Compression -->
<PackageVersion Include="SharpZipLib" Version="1.3.3" />
<PackageVersion Include="Squid-Box.SevenZipSharp.Lite" Version="1.5.0.366" />
<PackageVersion Include="ZstdNet" Version="1.4.5" />
<!-- Compression -->
<PackageVersion Include="SharpZipLib" Version="1.3.3" />
<PackageVersion Include="Squid-Box.SevenZipSharp.Lite" Version="1.5.0.366" />
<PackageVersion Include="ZstdNet" Version="1.4.5" />
<!-- Algorithm -->
<PackageVersion Include="Crc32.NET" Version="1.2.0" />
<PackageVersion Include="gfoidl.Base64" Version="1.1.1" />
<!-- Algorithm -->
<PackageVersion Include="Crc32.NET" Version="1.2.0" />
<PackageVersion Include="gfoidl.Base64" Version="1.1.1" />
<!--Command Line Tools-->
<PackageVersion Include="System.CommandLine" Version="2.0.0-beta3.22114.1" />
<PackageVersion Include="System.CommandLine.NamingConventionBinder" Version="2.0.0-beta3.22114.1" />
<!--Command Line Tools-->
<PackageVersion Include="System.CommandLine" Version="2.0.0-beta1.21308.1" />
<!-- Pinyin -->
<PackageVersion Include="TinyPinyin.Net" Version="1.0.2" />
<PackageVersion Include="XAB.TinyPinyin" Version="2.0.4.4" />
<!-- Pinyin -->
<PackageVersion Include="TinyPinyin.Net" Version="1.0.2" />
<!-- Win32/Windows -->
<PackageVersion Include="TaskScheduler" Version="2.10.1" />
<!-- Win32/Windows -->
<PackageVersion Include="TaskScheduler" Version="2.10.1" />
<!-- Swagger -->
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.3.1" />
<PackageVersion Include="Swashbuckle.AspNetCore.Annotations" Version="6.3.1" />
<PackageVersion Include="Swashbuckle.AspNetCore.Newtonsoft" Version="6.3.1" />
<PackageVersion Include="AspNetCore2.NETStandard.Swashbuckle.AspNetCore" Version="6.3.0" />
<PackageVersion Include="AspNetCore2.NETStandard.Swashbuckle.AspNetCore.Annotations" Version="6.3.0" />
<PackageVersion Include="AspNetCore2.NETStandard.Swashbuckle.AspNetCore.Newtonsoft" Version="6.3.0" />
<!-- Swagger -->
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.2.3" />
<!-- Pay -->
<!--<PackageVersion Include="AlipaySDKNet.Standard" Version="4.6.109" />-->
<!-- Pay -->
<!--<PackageVersion Include="AlipaySDKNet.Standard" Version="4.6.109" />-->
<!-- Excel -->
<PackageVersion Include="NPOI" Version="2.5.5" />
<!-- Excel -->
<PackageVersion Include="NPOI" Version="2.5.5" />
<!-- Github API -->
<PackageVersion Include="Octokit" Version="0.50.0" />
<!-- Github API -->
<PackageVersion Include="Octokit" Version="0.50.0" />
<!-- ORM -->
<PackageVersion Include="sqlite-net-pcl" Version="1.8.116" />
<PackageVersion Include="SQLitePCLRaw.bundle_green" Version="2.1.0-pre20220318192836" />
<!-- ORM -->
<PackageVersion Include="sqlite-net-pcl" Version="1.8.116" />
<PackageVersion Include="SQLitePCLRaw.bundle_green" Version="2.0.7" />
<!-- MonoMac(NETSTANDARD) -->
<PackageVersion Include="MonoMac.NetStandard" Version="0.0.4" />
<!-- MonoMac(NETSTANDARD) -->
<PackageVersion Include="MonoMac.NetStandard" Version="0.0.4" />
<!-- .NET Compat -->
<PackageVersion Include="OperatingSystem2" Version="1.4.3" />
<PackageVersion Include="JustArchiNET.Madness" Version="3.5.2" />
<!-- .NET Compat -->
<PackageVersion Include="OperatingSystem2" Version="1.4.3" />
<PackageVersion Include="JustArchiNET.Madness" Version="3.3.0" />
<!-- Serialize -->
<PackageVersion Include="MessagePack" Version="2.3.85" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.1" />
<!-- Serialize -->
<PackageVersion Include="MessagePack" Version="2.3.85" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.1" />
<!-- Html Parser -->
<PackageVersion Include="HtmlAgilityPack" Version="1.11.42" />
<!-- Html Parser -->
<PackageVersion Include="HtmlAgilityPack" Version="1.11.42" />
<!-- Clipboard -->
<PackageVersion Include="TextCopy" Version="6.1.0" />
<!-- Clipboard -->
<PackageVersion Include="TextCopy" Version="6.1.0" />
<!-- Nito.* -->
<PackageVersion Include="Nito.Comparers" Version="6.2.2" />
<!--<PackageVersion Include="Nito.Disposables" Version="2.2.1" />-->
<!-- Nito.* -->
<PackageVersion Include="Nito.Comparers" Version="6.2.2" />
<!--<PackageVersion Include="Nito.Disposables" Version="2.2.1" />-->
<!-- Valve Data File -->
<!--<PackageVersion Include="Gameloop.Vdf" Version="0.6.1" />-->
<PackageVersion Include="Microsoft.CSharp" Version="4.7.0" />
<PackageVersion Include="System.ComponentModel.TypeConverter" Version="4.3.0" />
<!-- Valve Data File -->
<!--<PackageVersion Include="Gameloop.Vdf" Version="0.6.1" />-->
<PackageVersion Include="Microsoft.CSharp" Version="4.7.0" />
<PackageVersion Include="System.ComponentModel.TypeConverter" Version="4.3.0" />
<!-- WebSocket -->
<PackageVersion Include="Fleck" Version="1.2.0" />
<!-- WebSocket -->
<PackageVersion Include="Fleck" Version="1.2.0" />
<!-- DNS -->
<PackageVersion Include="DnsClient" Version="1.6.0" />
<!-- DNS -->
<PackageVersion Include="DnsClient" Version="1.6.0" />
<!-- Cryptographic Algorithms & Protocols -->
<PackageVersion Include="Portable.BouncyCastle" Version="1.9.0" />
<!-- Cryptographic Algorithms & Protocols -->
<PackageVersion Include="Portable.BouncyCastle" Version="1.9.0" />
<!-- Resilience & Transient Fault Handling -->
<PackageVersion Include="Polly" Version="7.2.3" />
<!-- Resilience & Transient Fault Handling -->
<PackageVersion Include="Polly" Version="7.2.3" />
<!--Avalonia Start-->
<PackageVersion Include="Avalonia" Version="0.10.13" />
<PackageVersion Include="Avalonia.Desktop" Version="0.10.13" />
<PackageVersion Include="Avalonia.Skia" Version="0.10.13" />
<PackageVersion Include="Avalonia.Diagnostics" Version="0.10.13" />
<PackageVersion Include="Avalonia.ReactiveUI" Version="0.10.13" />
<!--<PackageVersion Include="Avalonia.Direct2D1" Version="0.10.13" />-->
<PackageVersion Include="Avalonia.Controls.DataGrid" Version="0.10.13" />
<PackageVersion Include="Avalonia.Xaml.Behaviors" Version="0.10.13.3" />
<!--<PackageVersion Include="Avalonia.AvaloniaEdit" Version="0.10.12.2" />-->
<!--<PackageVersion Include="CefNet.Avalonia" Version="93.1.21240.857" />-->
<!--<PackageVersion Include="LibVLCSharp.Avalonia" Version="3.5.1" />-->
<!--<PackageVersion Include="FluentAvaloniaUI" Version="1.3.0" />-->
<PackageVersion Include="JumpLists.Win32.Avalonia" Version="1.0.0" />
<!--Avalonia End-->
<!--Avalonia Start-->
<PackageVersion Include="Avalonia" Version="0.10.13" />
<PackageVersion Include="Avalonia.Desktop" Version="0.10.13" />
<PackageVersion Include="Avalonia.Skia" Version="0.10.13" />
<PackageVersion Include="Avalonia.Diagnostics" Version="0.10.13" />
<PackageVersion Include="Avalonia.ReactiveUI" Version="0.10.13" />
<!--<PackageVersion Include="Avalonia.Direct2D1" Version="0.10.13" />-->
<PackageVersion Include="Avalonia.Controls.DataGrid" Version="0.10.13" />
<PackageVersion Include="Avalonia.Xaml.Behaviors" Version="0.10.12.2" />
<!--<PackageVersion Include="Avalonia.AvaloniaEdit" Version="0.10.12.2" />-->
<!--<PackageVersion Include="CefNet.Avalonia" Version="93.1.21240.857" />-->
<!--<PackageVersion Include="LibVLCSharp.Avalonia" Version="3.5.1" />-->
<!--<PackageVersion Include="FluentAvaloniaUI" Version="1.3.0" />-->
<PackageVersion Include="JumpLists.Win32.Avalonia" Version="1.0.0" />
<!--Avalonia End-->
<!-- Xamarin.Android -->
<PackageVersion Include="Xamarin.Build.Download" Version="0.11.1" />
<PackageVersion Include="Xamarin.Google.Dagger" Version="2.39.1" />
<PackageVersion Include="Xamarin.Google.MLKit.BarcodeScanning" Version="116.1.2.5" />
<PackageVersion Include="Plugin.CurrentActivity" Version="2.1.0.4" />
<PackageVersion Include="de.hdodenhof.circleimageview" Version="3.1.0.4" />
<PackageVersion Include="Square.OkHttp3" Version="4.9.3" />
<PackageVersion Include="Square.Picasso" Version="2.71828.0" />
<!--<PackageVersion Include="LeakCanaryBinding" Version="1.5.1.1" />-->
<!--<PackageVersion Include="TencentOpenApiSDK.Android" Version="3.5.4.11" />-->
<PackageVersion Include="XAB.FlexboxLayout" Version="3.0.0.2" />
<!-- Xamarin.Android -->
<PackageVersion Include="Xamarin.Google.Dagger" Version="2.39.1" />
<PackageVersion Include="Xamarin.Google.MLKit.BarcodeScanning" Version="116.1.2.3" />
<PackageVersion Include="Plugin.CurrentActivity" Version="2.1.0.4" />
<PackageVersion Include="de.hdodenhof.circleimageview" Version="3.1.0.1" />
<PackageVersion Include="Square.OkHttp3" Version="4.9.2" />
<PackageVersion Include="Square.Picasso" Version="2.71828.0" />
<!--<PackageVersion Include="LeakCanaryBinding" Version="1.5.1.1" />-->
<!--<PackageVersion Include="TencentOpenApiSDK.Android" Version="3.5.4.11" />-->
<PackageVersion Include="XAB.FlexboxLayout" Version="3.0.0" />
<!-- V2Ray -->
<PackageVersion Include="XAB.AndroidLibV2rayLite" Version="1.0.0.1" />
<PackageVersion Include="Karamunting.KotlinX.Coroutines.Core" Version="1.4.2" />
<PackageVersion Include="Naxam.RxJava.Droid" Version="1.3.8-pre1" />
<!-- Xamarin.AndroidX -->
<PackageVersion Include="Xamarin.AndroidX.Migration" Version="1.0.8" />
<PackageVersion Include="Xamarin.AndroidX.AppCompat" Version="1.3.1.5" />
<PackageVersion Include="Xamarin.AndroidX.Emoji.AppCompat" Version="1.1.0.7" />
<PackageVersion Include="Xamarin.AndroidX.Fragment" Version="1.3.6.5" />
<PackageVersion Include="Xamarin.AndroidX.Navigation.Fragment" Version="2.3.5.5" />
<PackageVersion Include="Xamarin.AndroidX.RecyclerView" Version="1.2.1.5" />
<PackageVersion Include="Xamarin.Google.Android.Material" Version="1.4.0.6" />
<PackageVersion Include="Xamarin.AndroidX.SwipeRefreshLayout" Version="1.1.0.7" />
<PackageVersion Include="Xamarin.AndroidX.ConstraintLayout" Version="2.1.2.2" />
<PackageVersion Include="Xamarin.AndroidX.Navigation.UI" Version="2.3.5.5" />
<PackageVersion Include="Xamarin.AndroidX.ViewPager2" Version="1.0.0.14" />
<PackageVersion Include="Xamarin.AndroidX.Activity" Version="1.4.0.1" />
<PackageVersion Include="Xamarin.AndroidX.Biometric" Version="1.1.0.8" />
<PackageVersion Include="Xamarin.AndroidX.ExifInterface" Version="1.3.3.4" />
<PackageVersion Include="Xamarin.AndroidX.Legacy.Support.Core.UI" Version="1.0.0.13" />
<PackageVersion Include="Xamarin.AndroidX.Lifecycle.LiveData" Version="2.4.0.2" />
<PackageVersion Include="Xamarin.AndroidX.Camera.Camera2" Version="1.0.2.3" />
<PackageVersion Include="Xamarin.AndroidX.Camera.Lifecycle" Version="1.0.2.3" />
<PackageVersion Include="Xamarin.AndroidX.Camera.View" Version="1.0.0.5-alpha20" />
<!--<PackageVersion Include="Xamarin.AndroidX.Window" Version="1.0.0.3-beta02" />-->
<!-- V2Ray -->
<PackageVersion Include="XAB.AndroidLibV2rayLite" Version="1.0.0.1" />
<!--<PackageVersion Include="Karamunting.KotlinX.Coroutines.Core" Version="1.4.2" />-->
<PackageVersion Include="Xamarin.KotlinX.Coroutines.Core" Version="1.6.0.1" />
<PackageVersion Include="Xamarin.KotlinX.Coroutines.Android" Version="1.6.0.1" />
<PackageVersion Include="Xamarin.Android.ReactiveX.RxJava3.RxJava" Version="3.1.4.1" />
<!-- Xamarin.iOS -->
<PackageVersion Include="Toast.iOS" Version="1.2.0" />
<!-- Xamarin.AndroidX -->
<PackageVersion Include="Xamarin.AndroidX.Migration" Version="1.0.8" />
<PackageVersion Include="Xamarin.AndroidX.AppCompat" Version="1.4.1.1" />
<PackageVersion Include="Xamarin.AndroidX.Emoji.AppCompat" Version="1.1.0.8" />
<PackageVersion Include="Xamarin.AndroidX.Fragment" Version="1.4.1.1" />
<PackageVersion Include="Xamarin.AndroidX.RecyclerView" Version="1.2.1.6" />
<PackageVersion Include="Xamarin.Google.Android.Material" Version="1.5.0.2" />
<PackageVersion Include="Xamarin.AndroidX.SwipeRefreshLayout" Version="1.1.0.8" />
<PackageVersion Include="Xamarin.AndroidX.ConstraintLayout" Version="2.1.3.1" />
<PackageVersion Include="Xamarin.AndroidX.Navigation.UI" Version="2.4.1.1" />
<PackageVersion Include="Xamarin.AndroidX.Navigation.Fragment" Version="2.4.1.2" />
<PackageVersion Include="Xamarin.AndroidX.ViewPager2" Version="1.0.0.15" />
<PackageVersion Include="Xamarin.AndroidX.Activity" Version="1.4.0.2" />
<PackageVersion Include="Xamarin.AndroidX.Biometric" Version="1.1.0.9" />
<PackageVersion Include="Xamarin.AndroidX.ExifInterface" Version="1.3.3.5" />
<PackageVersion Include="Xamarin.AndroidX.Legacy.Support.Core.UI" Version="1.0.0.14" />
<PackageVersion Include="Xamarin.AndroidX.Lifecycle.LiveData" Version="2.4.1.1" />
<PackageVersion Include="Xamarin.AndroidX.Camera.Camera2" Version="1.0.2.4" />
<PackageVersion Include="Xamarin.AndroidX.Camera.Lifecycle" Version="1.0.2.4" />
<PackageVersion Include="Xamarin.AndroidX.Camera.View" Version="1.0.0.5-alpha20" />
<!--<PackageVersion Include="Xamarin.AndroidX.Window" Version="1.0.0.3-beta02" />-->
<!-- Xamarin.iOS -->
<PackageVersion Include="Toast.iOS" Version="1.2.0" />
<!-- UWP -->
<PackageVersion Include="Microsoft.Toolkit.Uwp.Notifications" Version="7.1.2" />
<!-- Code Style -->
<PackageVersion Include="StyleCop.Analyzers" Version="1.2.0-beta.406" />
</ItemGroup>
</ItemGroup>
</Project>
+13 -18
View File
@@ -4,7 +4,7 @@
English | [简体中文](./README.md)
"Steam++" is an open source cross-platform multi-purpose game toolkit, most of its features require you to download and install Steam to use it.
「Steam++」is a toolkit that contains a variety of Steam tools, most of which require you to download and install Steam in order to use them.
![Release Download](https://img.shields.io/github/downloads/rmbadmin/SteamTools/total?style=flat-square)
[![Release Version](https://img.shields.io/github/v/release/rmbadmin/SteamTools?style=flat-square)](https://github.com/rmbadmin/SteamTools/releases/latest)
@@ -32,24 +32,19 @@ English | [简体中文](./README.md)
- [GitHub Releases](https://github.com/BeyondDimension/SteamTools/releases)
- [Gitee Releases](https://gitee.com/rmbgame/SteamTools/releases)
- [Official WebSite](https://steampp.net)
- [![Microsoft Store](./resources/MSStore_English.png)](https://www.microsoft.com/store/apps/9MTCFHS560NG)
- [Arch Linux Package](https://aur.archlinux.org/packages/steam%2B%2B-bin)(By [zhanghua000](https://github.com/zhanghua000))
## ✨ Functions
1. Network Acceleration (Support Windows / Linux / macOS / Android)
- Make the Steam community, Github, Google reCAPTCHA, Pixiv, Discord, Twitch and other domestic hard-to-access pages accessible properly.
- Functions similar to [Steamcommunity 302](https://www.dogfight360.com/blog/686/), using [Titanium-Web-Proxy](https://github.com/justcoding121/Titanium-Web-Proxy) open source project for local anti-generation.
2. Script Configuration (Windows / Linux / macOS Only)
- Some JS scripts are injected into web pages through an acceleration service that intercepts web requests, providing functionality similar to that of a web plugin.
3. Account Switch (Windows / Linux / macOS Only)
- Switch between Steam accounts that are already logged in on the current PC with one click, and manage features such as sorting your home shared library.
4. Inventory Management (Windows / Linux / macOS Only)
- Lets you manage your Steam game inventory directly, not only by downloading older Steam games, but also by managing Steam game achievements directly, supporting unlocked achievements and unlocked achievements.
5. Local Authentication (Support Windows / Linux / macOS / Android)
- Let your cell phone token unified save in the computer, currently only support Steam token, later will develop support more token types with cloud synchronization token.
6. ArchiSteamFarm (Support Windows / Linux / macOS / Android)
- Integration with [ArchiSteamFarm](https://github.com/JustArchiNET/ArchiSteamFarm) provides functions such as hanging and dropping Steam Collectible Cards within the app.
7. Game Tools (Windows Only)
- Force game windows to use borderless windowing
1. Local reverse proxy for Steam's community webpage to enable normal access in **the Chinese Mainland, Mainland of China**
2. Quickly switch the Steam account that the current PC has remembered to log into
- This feature is to read the local user login records stored under the Steam path to directly display the operation, you can switch between multiple accounts without re-entering passwords and tokens.
3. Achievement stat modifications for Steam games
- Function reference SteamAchievementManager for secondary development, modified the game list loading and operation ease of use.
4. Steam Local Two-Step Authenticator
- The function reference [WinAuth](https://github.com/winauth/winauth) is developed to enable you to view your token without launching the mobile version of Steam App, similar function software are [WinAuth](https://github.com/winauth/winauth), [SteamDesktopAuthenticator](https://github.com/Jessecar96/SteamDesktopAuthenticator).
5. Some game tools
- Currently there is a forced game borderless windowing.
<!--Prerequisites Microsoft Visual C++ 2015-2019 Redistributable [64 bit](https://aka.ms/vs/16/release/vc_redist.x64.exe) / [32 bit](https://aka.ms/vs/16/release/vc_redist.x86.exe)-->
## 🖥 Supported Operating Systems
@@ -62,7 +57,7 @@ OS | Version | Architectures
[Windows Server][Windows-Server] | 2012+ | x64 | [Windows Server][Windows-Server-lifecycle]
**\*** Windows 7 SP1 is supported with [Extended Security Updates](https://docs.microsoft.com/troubleshoot/windows-client/windows-7-eos-faq/windows-7-extended-security-updates-faq) installed.
**\*** Microsoft Store(Desktop Bridge) Version 1809+
**\*** Microsoft Store/Desktop Bridge Version 1809+
[Windows-client]: https://www.microsoft.com/windows/
[Windows-lifecycle]: https://support.microsoft.com/help/13853/windows-lifecycle-fact-sheet
@@ -122,7 +117,7 @@ OS | Version | Architectures
OS | Version | Architectures |
------------------------------|---------------------------|-------------------|
[macOS][macOS] | 10.15+ | x64, Arm64 |
[macOS][macOS] | 10.14+ | x64 |
[macOS]: https://support.apple.com/macos
+20 -20
View File
@@ -4,7 +4,7 @@
[English](./README.en.md) | 简体中文
「Steam++」是一个开源跨平台的多功能游戏工具箱,此工具的大部分功能都是需要您下载安装 Steam 才能使用。
「Steam++」是一个包含多种Steam工具功能的工具箱,此工具的大部分功能都是需要您下载安装Steam才能使用。
![Release Download](https://img.shields.io/github/downloads/BeyondDimension/SteamTools/total?style=flat-square)
[![Release Version](https://img.shields.io/github/v/release/BeyondDimension/SteamTools?style=flat-square)](https://github.com/BeyondDimension/SteamTools/releases/latest)
@@ -33,24 +33,26 @@
- [GitHub Releases](https://github.com/BeyondDimension/SteamTools/releases)
- [Gitee Releases](https://gitee.com/rmbgame/SteamTools/releases)
- [Official WebSite](https://steampp.net)
- [![Microsoft Store](./resources/MSStore_English.png)](https://www.microsoft.com/store/apps/9MTCFHS560NG)
- [Arch Linux Package](https://aur.archlinux.org/packages/steam%2B%2B-bin)(By [zhanghua000](https://github.com/zhanghua000))
## ✨ 功能
1. 网络加速 (Support Windows / Linux / macOS / Android)
- 使 Steam 社区、Github、谷歌验证码、Pixiv、Discord、Twitch 等国内难以访问的网页正常访问。
- 功能类似 [Steamcommunity 302](https://www.dogfight360.com/blog/686/) ,使用 [Titanium-Web-Proxy](https://github.com/justcoding121/Titanium-Web-Proxy) 开源项目进行本地反代。
2. 脚本配置 (Windows / Linux / macOS Only)
- 通过加速服务拦截网络请求将一些 JS 脚本注入在网页中,提供类似网页插件的功能。
3. 账号切换 (Windows / Linux / macOS Only)
- 一键切换已在当前 PC 上登录过的 Steam 账号,与管理家庭共享库排序等功能。
4. 库存管理 (Windows / Linux / macOS Only)
- 让您直接管理到 Steam 游戏库存,不仅能够下载老版本的 Steam 游戏,也能够对 Steam 游戏成就进行直接管理,支持解锁成就以及反解锁成就。
5. 本地令牌 (Support Windows / Linux / macOS / Android)
- 让您的手机令牌统一保存在电脑中,目前仅支持 Steam 令牌,后续会开发支持更多的令牌种类与云同步令牌。
6. 自动挂卡 (Support Windows / Linux / macOS / Android)
- 集成 [ArchiSteamFarm](https://github.com/JustArchiNET/ArchiSteamFarm) 在应用内提供 挂机掉落 Steam 集换式卡牌 等功能。
7. 游戏工具 (Windows Only)
- 强制游戏窗口使用无边框窗口化
1. 反代 Steam 的社区网页使其能正常访问
- 功能类似羽翼城大佬的 [steamcommunity_302](https://www.dogfight360.com/blog/686/)
- 使用 [Titanium-Web-Proxy](https://github.com/justcoding121/Titanium-Web-Proxy) 开源项目进行本地反代,使国内用户可以正常访问 Steam 社区页
- 相比 **302工具** 具有更快的启动速度,以及支持简单的脚本注入(还顺便支持了Pixiv、Discord、Twitch等网站的反代支持)
2. 快速切换当前设备已记住登陆的 Steam 账号
- 该功能是读取 Steam 路径下存储的本地用户登录记录直接展示操作,可以多账号切换无需重新输入密码和令牌
3. Steam游戏的成就统计管理功能
- 功能参考 [SteamAchievementManager](https://github.com/gibbed/SteamAchievementManager) 进行二次开发,修改了游戏列表的加载和操作易用性
4. Steam本地两步身份验证器
- 功能参考 [WinAuth](https://github.com/winauth/winauth) 开发,可以使您不用启动移动版 Steam App 也能查看您的令牌
- 本地令牌交易市场报价确认
- 功能类似的软件例如:
- [WinAuth](https://github.com/winauth/winauth)
- [SteamDesktopAuthenticator](https://github.com/Jessecar96/SteamDesktopAuthenticator)
5. 其他游戏工具
- 目前已有强制游戏无边框窗口化
<!--发布配置SelfContained=true时会自动打包VC++相关程序集-->
<!--先决条件 Microsoft Visual C++ 2015-2019 Redistributable [64 位](https://aka.ms/vs/16/release/vc_redist.x64.exe) / [32 位](https://aka.ms/vs/16/release/vc_redist.x86.exe)-->
@@ -64,7 +66,7 @@ OS | Version | Architectures
[Windows Server][Windows-Server] | 2012+ | x64 | [Windows Server][Windows-Server-lifecycle]
**\*** Windows 7 SP1 is supported with [Extended Security Updates](https://docs.microsoft.com/troubleshoot/windows-client/windows-7-eos-faq/windows-7-extended-security-updates-faq) installed.
**\*** Microsoft Store(Desktop Bridge) Version 1809+
**\*** Microsoft Store/Desktop Bridge Version 1809+
[Windows-client]: https://www.microsoft.com/windows/
[Windows-lifecycle]: https://support.microsoft.com/help/13853/windows-lifecycle-fact-sheet
@@ -124,12 +126,10 @@ OS | Version | Architectures
OS | Version | Architectures |
------------------------------|---------------------------|-------------------|
[macOS][macOS] | 10.15+ | x64, Arm64 |
[macOS][macOS] | 10.14+ | x64 |
[macOS]: https://support.apple.com/macos
### Android
OS | Version | Architectures |
------------------------------|-------------------------|--------------------------------------------------------------------|
[Android][Android] | 5.0(API 21)+ | [x64][Android-x64], [Arm64][Android-Arm64], [Arm32][Android-Arm32] |
+5 -3
View File
@@ -16,15 +16,18 @@
"src\\Avalonia.Win32\\Avalonia.Win32.csproj",
"src\\Avalonia.X11\\Avalonia.X11.csproj",
"src\\Common.AreaLib\\Common.AreaLib.csproj",
"src\\Common.ClientLib.Droid\\Common.ClientLib.Droid.csproj",
"src\\Common.ClientLib.iOS\\Common.ClientLib.iOS.csproj",
"src\\Common.ClientLib\\Common.ClientLib.csproj",
"src\\Common.CoreLib\\Common.CoreLib.csproj",
"src\\Common.PinyinLib\\Common.PinyinLib.csproj",
"src\\Common.PinyinLib.ChnCharInfo\\Common.PinyinLib.ChnCharInfo.csproj",
"src\\Repositories.sqlite-net-pcl\\Repositories.sqlite-net-pcl.csproj",
"src\\ST.Client.Android\\ST.Client.Android.csproj",
"src\\ST.Client.Desktop.Linux\\ST.Client.Linux.csproj",
"src\\ST.Client.Mobile.Droid.App\\ST.Client.Android.App.csproj",
"src\\ST.Client.XamarinForms\\ST.Client.XamarinForms.csproj",
"src\\ST.Client.Desktop.Avalonia\\ST.Client.Avalonia.csproj",
"src\\ST.Client.Desktop.Avalonia.App\\ST.Client.Avalonia.App.csproj",
"src\\ST.Client.iOS\\ST.Client.iOS.csproj",
"src\\ST.Client\\ST.Client.csproj",
"src\\ST.Services.CloudService.Models\\ST.Services.CloudService.Models.csproj",
"src\\ST.Services.CloudService.ViewModels\\ST.Services.CloudService.ViewModels.csproj",
@@ -35,7 +38,6 @@
"src\\ST.Tools.OpenSourceLibraryList\\ST.Tools.OpenSourceLibraryList.csproj",
"src\\ST.Tools.Translate\\ST.Tools.Translate.csproj",
"src\\ST\\ST.csproj",
"src\\ST.Client.ResSecrets\\ST.Client.ResSecrets.csproj",
"tests\\Common.UnitTest.Droid.App\\ST.Client.UnitTest.Droid.App.csproj",
"tests\\Common.UnitTest.Droid\\ST.Client.UnitTest.Droid.csproj",
"tests\\Common.UnitTest\\Common.UnitTest.csproj",
+1 -6
View File
@@ -16,11 +16,10 @@
"src\\Avalonia.Win32\\Avalonia.Win32.csproj",
"src\\Avalonia.X11\\Avalonia.X11.csproj",
"src\\Common.AreaLib\\Common.AreaLib.csproj",
"src\\Common.ClientLib.Droid\\Common.ClientLib.Droid.csproj",
"src\\Common.ClientLib.iOS\\Common.ClientLib.iOS.csproj",
"src\\Common.ClientLib\\Common.ClientLib.csproj",
"src\\Common.CoreLib\\Common.CoreLib.csproj",
"src\\Common.PinyinLib\\Common.PinyinLib.csproj",
"src\\Common.PinyinLib.CFStringTransform\\Common.PinyinLib.CFStringTransform.csproj",
"src\\Repositories.sqlite-net-pcl\\Repositories.sqlite-net-pcl.csproj",
"src\\ST.Client.Android\\ST.Client.Android.csproj",
"src\\ST.Client.Desktop.Mac\\ST.Client.Mac.csproj",
@@ -39,10 +38,6 @@
"src\\ST.Tools.OpenSourceLibraryList\\ST.Tools.OpenSourceLibraryList.csproj",
"src\\ST.Tools.Translate\\ST.Tools.Translate.csproj",
"src\\ST\\ST.csproj",
"src\\ST.Client.ResSecrets\\ST.Client.ResSecrets.csproj",
"src\\ST.Client.iOS.ResSecrets\\ST.Client.iOS.ResSecrets.csproj",
"src\\ST.Client.Android.ResSecrets\\ST.Client.Android.ResSecrets.csproj",
"src\\ST.Client.Mac.ResSecrets\\ST.Client.Mac.ResSecrets.csproj",
"tests\\Common.UnitTest.Droid.App\\ST.Client.UnitTest.Droid.App.csproj",
"tests\\Common.UnitTest.Droid\\ST.Client.UnitTest.Droid.csproj",
"tests\\Common.UnitTest\\Common.UnitTest.csproj",
+31 -219
View File
@@ -152,6 +152,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Github", "_Github", "{B114
.github\workflows\xamarin.yml = .github\workflows\xamarin.yml
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.ClientLib.Droid", "src\Common.ClientLib.Droid\Common.ClientLib.Droid.csproj", "{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.ClientLib.iOS", "src\Common.ClientLib.iOS\Common.ClientLib.iOS.csproj", "{4658B02A-CB1A-4561-AD9C-3B3FF969D7F0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Client.UnitTest.Droid", "tests\Common.UnitTest.Droid\ST.Client.UnitTest.Droid.csproj", "{80E6762E-AB43-41E2-BDB4-7A3E24713977}"
@@ -172,22 +174,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Client.Android.V2Ray", "
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Gameloop.Vdf", "references\Gameloop.Vdf\Gameloop.Vdf\Gameloop.Vdf.csproj", "{DFC341E8-5290-428C-8D2B-6DE2AA163FFE}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Client.Android.Shadowsocks", "src\ST.Client.Android.Shadowsocks\ST.Client.Android.Shadowsocks.csproj", "{920EF29F-406F-43A9-B002-29DD6B0B4FBF}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Client.Android.App.Modern", "src\ST.Client.Android.App.Modern\ST.Client.Android.App.Modern.csproj", "{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ResSecrets", "ResSecrets", "{17667B53-1A09-45A6-855A-0F07F9AE044F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Client.Android.ResSecrets", "src\ST.Client.Android.ResSecrets\ST.Client.Android.ResSecrets.csproj", "{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Client.ResSecrets", "src\ST.Client.ResSecrets\ST.Client.ResSecrets.csproj", "{089D4418-975B-455D-9AE1-B9DEC20FF4B1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ST.Client.iOS.ResSecrets", "src\ST.Client.iOS.ResSecrets\ST.Client.iOS.ResSecrets.csproj", "{872B65EB-E9DF-4357-B541-DD4A39B281A0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ST.Client.Mac.ResSecrets", "src\ST.Client.Mac.ResSecrets\ST.Client.Mac.ResSecrets.csproj", "{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ST.Client.Windows.ResSecrets", "src\ST.Client.Windows.ResSecrets\ST.Client.Windows.ResSecrets.csproj", "{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -1606,6 +1592,34 @@ Global
{29DE5086-0690-4AE7-9BA9-840F54B249DC}.Release|x64.Build.0 = Release|Any CPU
{29DE5086-0690-4AE7-9BA9-840F54B249DC}.Release|x86.ActiveCfg = Release|Any CPU
{29DE5086-0690-4AE7-9BA9-840F54B249DC}.Release|x86.Build.0 = Release|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Debug|ARM.ActiveCfg = Debug|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Debug|ARM.Build.0 = Debug|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Debug|ARM64.Build.0 = Debug|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Debug|iPhone.Build.0 = Debug|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Debug|x64.ActiveCfg = Debug|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Debug|x64.Build.0 = Debug|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Debug|x86.ActiveCfg = Debug|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Debug|x86.Build.0 = Debug|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Release|Any CPU.Build.0 = Release|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Release|ARM.ActiveCfg = Release|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Release|ARM.Build.0 = Release|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Release|ARM64.ActiveCfg = Release|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Release|ARM64.Build.0 = Release|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Release|iPhone.ActiveCfg = Release|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Release|iPhone.Build.0 = Release|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Release|x64.ActiveCfg = Release|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Release|x64.Build.0 = Release|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Release|x86.ActiveCfg = Release|Any CPU
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C}.Release|x86.Build.0 = Release|Any CPU
{4658B02A-CB1A-4561-AD9C-3B3FF969D7F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4658B02A-CB1A-4561-AD9C-3B3FF969D7F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4658B02A-CB1A-4561-AD9C-3B3FF969D7F0}.Debug|ARM.ActiveCfg = Debug|Any CPU
@@ -1872,202 +1886,6 @@ Global
{DFC341E8-5290-428C-8D2B-6DE2AA163FFE}.Release|x64.Build.0 = Release|Any CPU
{DFC341E8-5290-428C-8D2B-6DE2AA163FFE}.Release|x86.ActiveCfg = Release|Any CPU
{DFC341E8-5290-428C-8D2B-6DE2AA163FFE}.Release|x86.Build.0 = Release|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|ARM.ActiveCfg = Debug|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|ARM.Build.0 = Debug|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|ARM64.Build.0 = Debug|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|iPhone.Build.0 = Debug|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|x64.ActiveCfg = Debug|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|x64.Build.0 = Debug|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|x86.ActiveCfg = Debug|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|x86.Build.0 = Debug|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|Any CPU.Build.0 = Release|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|ARM.ActiveCfg = Release|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|ARM.Build.0 = Release|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|ARM64.ActiveCfg = Release|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|ARM64.Build.0 = Release|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|iPhone.ActiveCfg = Release|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|iPhone.Build.0 = Release|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|x64.ActiveCfg = Release|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|x64.Build.0 = Release|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|x86.ActiveCfg = Release|Any CPU
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|x86.Build.0 = Release|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Debug|ARM.ActiveCfg = Debug|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Debug|ARM.Build.0 = Debug|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Debug|ARM64.Build.0 = Debug|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Debug|iPhone.Build.0 = Debug|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Debug|x64.ActiveCfg = Debug|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Debug|x64.Build.0 = Debug|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Debug|x86.ActiveCfg = Debug|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Debug|x86.Build.0 = Debug|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Release|Any CPU.Build.0 = Release|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Release|ARM.ActiveCfg = Release|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Release|ARM.Build.0 = Release|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Release|ARM64.ActiveCfg = Release|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Release|ARM64.Build.0 = Release|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Release|iPhone.ActiveCfg = Release|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Release|iPhone.Build.0 = Release|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Release|x64.ActiveCfg = Release|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Release|x64.Build.0 = Release|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Release|x86.ActiveCfg = Release|Any CPU
{5E2ABB4A-FDD6-47B0-946D-FAAD31301B82}.Release|x86.Build.0 = Release|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Debug|Any CPU.Build.0 = Debug|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Debug|ARM.ActiveCfg = Debug|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Debug|ARM.Build.0 = Debug|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Debug|ARM64.Build.0 = Debug|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Debug|iPhone.Build.0 = Debug|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Debug|x64.ActiveCfg = Debug|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Debug|x64.Build.0 = Debug|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Debug|x86.ActiveCfg = Debug|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Debug|x86.Build.0 = Debug|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Release|Any CPU.ActiveCfg = Release|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Release|Any CPU.Build.0 = Release|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Release|ARM.ActiveCfg = Release|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Release|ARM.Build.0 = Release|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Release|ARM64.ActiveCfg = Release|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Release|ARM64.Build.0 = Release|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Release|iPhone.ActiveCfg = Release|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Release|iPhone.Build.0 = Release|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Release|x64.ActiveCfg = Release|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Release|x64.Build.0 = Release|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Release|x86.ActiveCfg = Release|Any CPU
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Release|x86.Build.0 = Release|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Debug|ARM.ActiveCfg = Debug|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Debug|ARM.Build.0 = Debug|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Debug|ARM64.Build.0 = Debug|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Debug|iPhone.Build.0 = Debug|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Debug|x64.ActiveCfg = Debug|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Debug|x64.Build.0 = Debug|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Debug|x86.ActiveCfg = Debug|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Debug|x86.Build.0 = Debug|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Release|Any CPU.Build.0 = Release|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Release|ARM.ActiveCfg = Release|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Release|ARM.Build.0 = Release|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Release|ARM64.ActiveCfg = Release|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Release|ARM64.Build.0 = Release|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Release|iPhone.ActiveCfg = Release|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Release|iPhone.Build.0 = Release|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Release|x64.ActiveCfg = Release|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Release|x64.Build.0 = Release|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Release|x86.ActiveCfg = Release|Any CPU
{089D4418-975B-455D-9AE1-B9DEC20FF4B1}.Release|x86.Build.0 = Release|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Debug|ARM.ActiveCfg = Debug|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Debug|ARM.Build.0 = Debug|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Debug|ARM64.Build.0 = Debug|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Debug|iPhone.Build.0 = Debug|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Debug|x64.ActiveCfg = Debug|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Debug|x64.Build.0 = Debug|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Debug|x86.ActiveCfg = Debug|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Debug|x86.Build.0 = Debug|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Release|Any CPU.Build.0 = Release|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Release|ARM.ActiveCfg = Release|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Release|ARM.Build.0 = Release|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Release|ARM64.ActiveCfg = Release|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Release|ARM64.Build.0 = Release|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Release|iPhone.ActiveCfg = Release|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Release|iPhone.Build.0 = Release|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Release|x64.ActiveCfg = Release|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Release|x64.Build.0 = Release|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Release|x86.ActiveCfg = Release|Any CPU
{872B65EB-E9DF-4357-B541-DD4A39B281A0}.Release|x86.Build.0 = Release|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Debug|ARM.ActiveCfg = Debug|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Debug|ARM.Build.0 = Debug|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Debug|ARM64.Build.0 = Debug|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Debug|iPhone.Build.0 = Debug|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Debug|x64.ActiveCfg = Debug|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Debug|x64.Build.0 = Debug|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Debug|x86.ActiveCfg = Debug|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Debug|x86.Build.0 = Debug|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Release|Any CPU.Build.0 = Release|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Release|ARM.ActiveCfg = Release|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Release|ARM.Build.0 = Release|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Release|ARM64.ActiveCfg = Release|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Release|ARM64.Build.0 = Release|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Release|iPhone.ActiveCfg = Release|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Release|iPhone.Build.0 = Release|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Release|x64.ActiveCfg = Release|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Release|x64.Build.0 = Release|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Release|x86.ActiveCfg = Release|Any CPU
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C}.Release|x86.Build.0 = Release|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Debug|ARM.ActiveCfg = Debug|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Debug|ARM.Build.0 = Debug|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Debug|ARM64.Build.0 = Debug|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Debug|iPhone.Build.0 = Debug|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Debug|x64.ActiveCfg = Debug|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Debug|x64.Build.0 = Debug|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Debug|x86.ActiveCfg = Debug|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Debug|x86.Build.0 = Debug|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Release|Any CPU.Build.0 = Release|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Release|ARM.ActiveCfg = Release|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Release|ARM.Build.0 = Release|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Release|ARM64.ActiveCfg = Release|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Release|ARM64.Build.0 = Release|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Release|iPhone.ActiveCfg = Release|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Release|iPhone.Build.0 = Release|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Release|x64.ActiveCfg = Release|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Release|x64.Build.0 = Release|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Release|x86.ActiveCfg = Release|Any CPU
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -2124,6 +1942,7 @@ Global
{E85E92BA-202F-42D3-8C5E-96DA452501B7} = {910D6A0F-42AB-4B65-B532-852E864EC006}
{21C392C5-AE41-421A-A127-1A03C4ACA2AD} = {673FF8CD-9E85-4FA1-ABFC-D1149675E138}
{29DE5086-0690-4AE7-9BA9-840F54B249DC} = {E448F863-4C9D-47A4-BC4A-4A1381B54DA4}
{3C7200C7-8C2D-46F0-BD7D-0A59D915B83C} = {83186945-EC14-4B3F-8C6F-B205AA184CA4}
{4658B02A-CB1A-4561-AD9C-3B3FF969D7F0} = {83186945-EC14-4B3F-8C6F-B205AA184CA4}
{80E6762E-AB43-41E2-BDB4-7A3E24713977} = {CC46B486-00D7-49E6-ABA3-FDF8F4868D2B}
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA} = {CC46B486-00D7-49E6-ABA3-FDF8F4868D2B}
@@ -2134,13 +1953,6 @@ Global
{80EBD601-28AC-4840-B9B8-E6064816A443} = {327FDEE7-C4C8-4AA4-A7B0-8BCE3D75346F}
{4A79264D-5BF5-4F89-8066-44E154BF557F} = {80EBD601-28AC-4840-B9B8-E6064816A443}
{DFC341E8-5290-428C-8D2B-6DE2AA163FFE} = {673FF8CD-9E85-4FA1-ABFC-D1149675E138}
{920EF29F-406F-43A9-B002-29DD6B0B4FBF} = {80EBD601-28AC-4840-B9B8-E6064816A443}
{17667B53-1A09-45A6-855A-0F07F9AE044F} = {327FDEE7-C4C8-4AA4-A7B0-8BCE3D75346F}
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277} = {17667B53-1A09-45A6-855A-0F07F9AE044F}
{089D4418-975B-455D-9AE1-B9DEC20FF4B1} = {17667B53-1A09-45A6-855A-0F07F9AE044F}
{872B65EB-E9DF-4357-B541-DD4A39B281A0} = {17667B53-1A09-45A6-855A-0F07F9AE044F}
{3950554F-7219-4AB9-9BE8-9B5EBDBCA88C} = {17667B53-1A09-45A6-855A-0F07F9AE044F}
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E} = {17667B53-1A09-45A6-855A-0F07F9AE044F}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
RESX_NeutralResourcesLanguage = zh-Hans
+10 -14
View File
@@ -1,27 +1,23 @@
# 下载指南
- Desktop(桌面端)
- Windows
- 如果你使用 Intel、AMD 的 x64(x86-64) 芯片的 PC,则下载文件名中带有 **win_x64** 的文件
- 如果你 **已安装** 了 [ASP.NET Core 运行时 6.0.4](https://dotnet.microsoft.com/zh-cn/download/dotnet/6.0) 则下载文件名中带有 **fde(框架依赖)** 的文件
- 注意:是 《ASP.NET Core 运行时》 而不是 《.NET 桌面运行时》
- [在 Windows 上安装 .NET](https://docs.microsoft.com/zh-cn/dotnet/core/install/windows)
- 本程序在 Windows 上不需要 Hosting Bundle 和 IIS support
- [下载安装程序并手动安装(aspnetcore-runtime-6.0.4-win-x64.exe)](https://dotnet.microsoft.com/zh-cn/download/dotnet/thank-you/runtime-aspnetcore-6.0.4-windows-x64-installer)
- [使用 PowerShell 自动化安装](https://docs.microsoft.com/zh-cn/dotnet/core/install/windows?tabs=net60#install-with-powershell-automation)
- 如果你使用 Intel、AMD 的 x64 芯片的 PC(较为**普遍**),则下载文件名中带有 **win_x64** 的文件
- 如果你已安装了 [ASP.NET Core Runtime 6.0.1](https://dotnet.microsoft.com/download/dotnet/6.0) 则下载文件名中带有 **fde** 的文件,可减少磁盘占用空间
- [在 Windows 上安装 .NET](https://docs.microsoft.com/en-us/dotnet/core/install/windows)
- 在 Windows 上不需要 Hosting Bundle 和 IIS support
- [下载安装程序并手动安装(aspnetcore-runtime-6.0.1-win-x64.exe)](https://dotnet.microsoft.com/download/dotnet/thank-you/runtime-aspnetcore-6.0.1-windows-x64-installer)
- [使用 PowerShell 自动化安装](https://docs.microsoft.com/en-us/dotnet/core/install/windows?tabs=net60#install-with-powershell-automation)
- macOS
- 如果你使用 Intel 的 x64(x86-64) 芯片的 Mac,则下载文件名中带有 **macos_x64** 的文件
- 如果你使用 ARM64(Apple Silicon) 芯片的 Mac,例如 **Apple M1**,则下载文件名中带有 **macos_arm64** 的文件
- 如果你使用 Intel、AMD 的 x64 芯片的 Mac(较为**普遍**),则下载文件名中带有 **macos_x64** 的文件
- 如果你使用 ARM64 芯片的 Mac(较为**稀有**),例如 **M1**,则下载文件名中带有 **macos_arm64** 的文件
- Linux
- 如果你使用 Intel、AMD 的 x64(x86-64) 芯片的 PC 则下载文件名中带有 **linux_x64** 的文件
- 如果你使用 ARM64 芯片的 PC 例如 **Raspberry Pi Model 3+**,则下载文件名中带有 **linux_arm64** 的文件
<!--
- 如果你使用 Intel、AMD 的 x64 芯片的 PC(较为**普遍**)则下载文件名中带有 **linux_x64** 的文件
- 如果你使用 ARM64 芯片的 PC(较为**稀有**)例如 **Raspberry Pi Model 3+**,则下载文件名中带有 **linux_arm64** 的文件
- Mobile(移动端)
- Android
- 如果你使用 ARM64 芯片的设备(较为**普遍**)则下载文件名中带有 **android_arm64_v8a** 的文件
- 如果你使用 ARM32 芯片的设备(较为**稀有**)通常为 **14** 年下半年之前生产的设备,则下载文件名中带有 **android_armeabi_v7a** 的文件
- 如果你使用 Intel、AMD 的 x64 芯片的设备(较为**稀有**)则下载文件名中带有 **android_x64** 的文件
-->
<!--
- 如果你使用 ARM64 芯片的 PC(极为**稀有**),例如 **Surface Pro X**,则下载文件名中带有 **win_x64** 的文件可通过 Win11 x86 模拟运行
+2 -3
View File
@@ -1,9 +1,8 @@
{
"msbuild-sdks": {
"MSBuild.Sdk.Extras": "3.0.44",
"Xamarin.Legacy.Sdk": "0.1.2-alpha6"
"MSBuild.Sdk.Extras": "3.0.44"
},
"sdk": {
"version": "6.0.202"
"version": "6.0.200"
}
}
+3 -3
View File
@@ -7,11 +7,11 @@
<key>CFBundleIdentifier</key>
<string>net.steampp.app</string>
<key>CFBundleShortVersionString</key>
<string>2.7.0</string>
<string>2.4.10</string>
<key>CFBundleVersion</key>
<string>2.7.0.0</string>
<string>2.4.10.0</string>
<key>LSMinimumSystemVersion</key>
<string>10.15</string>
<string>10.14</string>
<key>CFBundleDevelopmentRegion</key>
<string>zh_CN</string>
<key>CFBundleInfoDictionaryVersion</key>
+18 -12
View File
@@ -1,7 +1,7 @@
create_app_structure() {
APPNAME=$1
APPDIR="$APPNAME.app/Contents"
APPICONS="${{ Steam++_IcnsFile }}"
APPICONS="/Users/mossimo/bin/logo.icns"
if [ ! -d "$APPDIR" ]; then
echo "creating app structure $APPDIR"
@@ -33,19 +33,19 @@ emit_plist() {
<key>CFBundleIdentifier</key>
<string>net.steampp.app</string>
<key>CFBundleShortVersionString</key>
<string>${{ Steam++_ShortVersion }}</string>
<string>2.6.9</string>
<key>CFBundleVersion</key>
<string>${{ Steam++_Version }}</string>
<string>2.6.9.0</string>
<key>LSMinimumSystemVersion</key>
<string>10.15</string>
<string>10.14</string>
<key>CFBundleDevelopmentRegion</key>
<string>zh_CN</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleExecutable</key>
<string>${{ Steam++_RunName }}</string>
<string>$PLIST_APPNAME</string>
<key>CFBundleGetInfoString</key>
<string>${{ Steam++_RunName }}</string>
<string>$PLIST_APPNAME</string>
<key>CFBundleIconFile</key>
<string>$PLIST_APPNAME</string>
<key>CFBundlePackageType</key>
@@ -64,10 +64,10 @@ EOF
fi
}
cd "${{ Steam++_OutPutFilePath }}"
cd "/Users/mossimo/bin"
BINARYNAME="${{ Steam++_AppName }}"
BINARYNAME="Steam++"
echo "Building Avalonia demo..."
@@ -80,8 +80,14 @@ rm -rf "$APPDIR"
create_app_structure "$APPNAME"
emit_plist "$APPNAME" "$APPDIR" true
mv -f "${{ Steam++_APPDIR }}" "$APPDIR/MacOS"
chmod +x "$APPDIR/MacOS/Steam++"
cd "$APPDIR/Frameworks"
mkdir "${{ Steam++_APPDIR }}"
mv -f "${{ Steam++_OutPutFilePath }}/$BINARYNAME.app" "${{ Steam++_APPDIR }}/$BINARYNAME.app"
APPNAME="$BINARYNAME Helper"
APPDIR="$APPNAME.app/Contents"
create_app_structure "$APPNAME"
emit_plist "$APPNAME" "$APPDIR"
cp -R "../../../steampp/" "../MacOS"
ln -s "../../MacOS" "Frameworks/$APPDIR/MacOS"
chmod +x "../MacOS/$BINARYNAME"
cp "../MacOS/$BINARYNAME" "../MacOS/$APPNAME"
chmod +x "../MacOS/$APPNAME"
-7
View File
@@ -1,7 +0,0 @@
[*.cs]
# IDE0055: 修正格式
dotnet_diagnostic.IDE0055.severity = suggestion
# IDE1006: 命名样式
dotnet_diagnostic.IDE1006.severity = suggestion
-7
View File
@@ -1,7 +0,0 @@
# ARM64(Windows/macOS/Linux) Native Library
## 7z.dll
21.07 (2021-12-26) by https://www.7-zip.org
## libe_sqlite3.dylib
sqlitepclraw.lib.e_sqlite3.2.0.7.nupkg
Binary file not shown.
-98
View File
@@ -1,98 +0,0 @@
DU'LAN 都兰
ZHA'SHUI 柞水
LU'HE 六合
JUN'LIAN 筠连
JIANG'DU 江都
BAI'XIANG 柏乡
CHANG'YANG 长阳
CHANG'CHUN 长春
CHANG'BAI 长白
CHENG'DU 成都
MIN'HANG 闵行
XIN'DU 新都
TIAN'CHANG 天长
PAN'YU 番禺
DU'YUN 都匀
CHANG'YUAN 长垣
CHANG'ZHI'XIAN 长治县
WU'DU 武都
CHEN'QIU 沈丘
WEN'XIU 温宿
BENG'BU 蚌埠
CHANG'SHUN 长顺
BI'YANG 泌阳
SHEN'XIAN 莘县
DA'BU 大埔
TA'SHI'KU'ER'GAN 塔什库尔干
SAN'DU 三都
YAN'DU 盐都
ZI'CHANG 子长
YU'DU 于都
MIN'YUE 民乐
HUA'DU 花都
SHANG'DU 商都
DU'CHANG 都昌
KE'SHI'KE'TENG'QI 克什克腾旗
YAN'CHANG 延长
CHANG'BAI'SHAN 长白山
NING'DU 宁都
ZENG'MU'AN'SHA 曾母暗沙
NAN'YUE 南乐
CHANG'WU 长武
CHANG'NING 长宁
CHANG'AN 长安
CHONG'QING 重庆
HANG'TANG 行唐
GA'SHI 伽师
CHANG'SHOU 长寿
SUI'LING 绥棱
CHANG'TING 长汀
FAN'SHI 繁峙
CHANG'SHA 长沙
CHANG'DAO 长岛
XIA'MEN 厦门
CHANG'LING 长岭
CHANG'TAI 长泰
YU'LI 尉犁
LU'AN 六安
BA'XIU 八宿
CHANG'HAI 长海
MU'PING 牟平
A'TU'SHI 阿图什
CHANG'ZHI'SHI 长治市
CHANG'QING 长清
CHANG'FENG 长丰
CHANG'LE 长乐
FENG'DU 丰都
KA'SHI 喀什
TONG'BAI 桐柏
YUE'QING 乐清
ZHONG'MU 中牟
SHI'FANG 什邡
WU'SHI 乌什
DU'AN 都安
LAO'TING 乐亭
WU'BU 吴堡
NA'QU 那曲
SHAN'XIAN 单县
NA'PO 那坡
JU'MO 且末
CHANG'XING 长兴
GONG'CHANG'LING 弓长岭
CHANG'DU 昌都
XIAO'TING 猇亭
GUO'YANG 涡阳
QIAN'WEI 犍为
WANG'DU 望都
LUE'YANG 略阳
SHUANG'BAI 双柏
CHANG'SHA'XIAN 长沙县
XIN'YUE 新乐
CHANG'GE 长葛
CUO'NA 错那
DU'JIANG'YAN 都江堰
LANG'QIA'ZI 浪卡子
XING'YANG 荥阳
LU'QU 碌曲
HUANG'PI 黄陂
@@ -1,8 +0,0 @@
# Android Native Library
[Xamarin.Android 支持通过标准 PInvoke 机制使用本机库。 你还可以将不属于 OS 的其他本机库绑定到你的 .apk。](https://docs.microsoft.com/zh-cn/xamarin/android/platform/native-libraries)
## libgojni.so & libtun2socks.so
Source code compilation by https://github.com/2dust/v2rayNG
## shadowsocks-android\libtun2socks.so
Apk extraction by https://github.com/shadowsocks/shadowsocks-android/releases/tag/v5.2.6
+2 -3
View File
@@ -3,6 +3,5 @@ using static System.Properties.ThisAssembly;
[assembly: SuppressIldasm]
[assembly: InternalsVisibleTo("System.Application.SteamTools.Client" + PublicKey)]
[assembly: InternalsVisibleTo("System.Application.SteamTools.Client.Avalonia" + PublicKey)]
[assembly: InternalsVisibleTo("Xamarin.Forms.Platform.Android.UnitTests" + PublicKey)]
[assembly: InternalsVisibleTo("Assembly-CSharp" + PublicKey)]
[assembly: InternalsVisibleTo("System.Application.SteamTools.Client.Mobile" + PublicKey)]
[assembly: InternalsVisibleTo("System.Application.SteamTools.Client.Desktop" + PublicKey)]
-7
View File
@@ -1,7 +0,0 @@
# Windows/macOS/Linux x64 Native Library & General C# Source Code & Third Party Projects
## 7z.dll
21.07 (2021-12-26) by https://www.7-zip.org
## libzstd.dll
https://github.com/facebook/zstd/releases/tag/v1.5.2
-4
View File
@@ -1,4 +0,0 @@
# Windows/macOS/Linux x86(32 bit) Native Library
## 7z.dll
21.07 (2021-12-26) by https://www.7-zip.org
+44 -52
View File
@@ -1,34 +1,27 @@
### 版本亮点
1. Android 支持 VPN 模式(推荐) 进行本地加速
2. 新增 Steam 游戏信息编辑功能,可修改游戏名称、图片、启动项等数据并同步至 Steam 客户端生效
3. ASF 升级至 V5.2.5.4
4. 优化了显示图片时 GPU 占用
5. 优化库存游戏和脚本内存占用
6. 库存游戏编辑功能支持从 SteamGridDB 匹配预览和下载图片
7. 网络加速新增 MEGA 网盘反代服务
8. macOS 支持 Arm64(Apple Silicon)
<!--
. ~~Windows 支持 DNS 驱动拦截模式(推荐) 进行本地加速~~
-->
1. ASF 升级至 **V5.2.3.5**
2. ASF 配置 中新增 设置自定义密钥(ASF_CRYPTKEY) 与 导入 Bot 文件
3. Linux 发行压缩包由 7z 格式更改为 tar.zst
4. 网络加速 支持 IPv6 网络访问 Steam 讨论/留言相关功能
6. 网络加速 支持 Steam 商店 访问被限制的游戏页面
7. 网络加速 新增了部分被限制的 CDN 加速,支持访问 stackoverflow
8. 账号切换 家庭库共享管理新增暂时禁用启用指定账号的功能 可在排序失效时使用
### 修复问题
1. 修复 本地令牌 无令牌刷新时提示密码错误
2. 改进 Android 端 本地令牌 列表样式第一条与最后一条的上下外边距
3. 改进 俄语翻译,由 vanja-san 提供
4. 改进 .NET 运行时升级至 6.0.4(仅 Desktop 端)
5. 改进 脚本配置 未启动时的内存占用,以及减少总体内存占用率
6. 修复 Hosts 加速模式下使用仅启用脚本功能导致死循环
7. 改进 Linux 端 可监听 443 端口配置
8. 修复 Windows 端,动态桌面背景窗口显示时一些可能导致闪退的潜在问题
9. 修复 Android 端,因 CheckBox 导致在低于 6.0 Marshmallow 系统上引发的闪退
10. 修复 Desktop 高 DPI 分辨率下菜单图标会显示模糊的问题
11. 修复 Windows 端,切换至网络加速菜单时可能会出现 UI 错乱的问题
12. 修复 Desktop 端,某些情况库存游戏会卡住无限加载的问题
13. 修复 网络加速 Onedrive 加速失效问题
14. 修复 消息框不再提醒复选框勾上可能不生效的问题
15. 修复 Windows 端, JumpList 切换 Steam Beta 账号失效的问题
16. 修复 ASF,当使用 IPC.config 时,程序内打开网页端口号值不正确
1. 修复 Android 端 程序启动时自动运行 网络加速 与 ASF 服务
2. 修复 Android 端 网络加速 VPN 模式
3. 修复 Android 端 切换系统语言时可能导致的闪退
4. 修复 Android 端 拒绝授予存储权限导致的闪退
5. 改进 网络加速 中的代理证书生成
6. 改进 账号切换 中读取 Vdf 配置操作
7. 修复 Desktop 端 家庭共享库管理 在 Steam Beta 版上不能正常使用
8. 修复 网络加速 Twitch 聊天服务链接不上的问题
9. 修复 网络加速 github.io 加速影响部分仓库访问 404 的问题
10. 修复 网络加速 Steam 社区加速后会出现【请重新输入下方验证码中的字符来验证此为人工操作】的问题
11. 暂时移除了网络加速中部分失效的加速项目
12. 修复 令牌交易 登录状态失效时刷新应该回到登录界面
13. 改进 本地令牌 移除令牌时的提示
14. 修复 网络加速 滚动条错误滚动的问题
### 已知问题
- 除 Windows 之外的平台此软件自动更新尚不可用
@@ -36,6 +29,7 @@
- macOS
- [尚未公证](https://support.apple.com/zh-cn/guide/mac-help/mh40616/10.15/mac/10.15),这会影响 macOS Catalina(版本 10.15)以上版本
- Linux
- **Hosts 代理模式**可能无法配置成功,推荐使用**系统代理模式**
- 窗口弹出位置不正确
- 鼠标指针浮动样式不正确
- Windows
@@ -48,20 +42,19 @@
- 需要安装 Extended Security Update
- 在不符合先决条件的情况下运行可能导致
- 程序无法正常运行
- **解决方案**
- 使用 Windows Update 更新系统补丁
- 运行程序时提示 计算机中丢失 api-ms-win-core-winrt-l1-1-0.dll
- **解决方案**
- 下载 api-ms-win-core-winrt-l1-1-0.dll 文件放入程序根目录(Steam++.exe 所在文件夹)
- [从 Github 上直接下载](https://github.com/BeyondDimension/SteamTools/raw/develop/references/runtime.win7-x64.Microsoft.NETCore.Windows.ApiSets/api-ms-win-core-winrt-l1-1-0.dll)
- [从 Gitee 上直接下载](https://gitee.com/rmbgame/SteamTools/raw/develop/references/runtime.win7-x64.Microsoft.NETCore.Windows.ApiSets/api-ms-win-core-winrt-l1-1-0.dll)
- Android
- 本地加速
- 因 Android 7(Nougat API 24) 之后的版本不在信任用户证书,所以此功能已放弃继续开发,如仍想使用需要自行导入证书到系统目录,使用 adb 工具或 Magisk 之类的软件操作,未来会使用不需要证书的加速功能替换此功能
- **解决方案**
- 因 [Windows 7 延长结束日期](https://support.microsoft.com/zh-cn/windows/windows-7-%E6%94%AF%E6%8C%81%E4%BA%8E-2020-%E5%B9%B4-1-%E6%9C%88-14-%E6%97%A5%E7%BB%88%E6%AD%A2-b75d4580-2cc7-895a-2c9c-1466d9a53962)以于 2020 年 1 月 14 日结束支持
- 所以必须安装 [Extended Security Update](https://docs.microsoft.com/zh-cn/troubleshoot/windows-client/windows-7-eos-faq/windows-7-extended-security-updates-faq) 支持,在安装第三年的补丁后[结束支持日期](https://docs.microsoft.com/zh-cn/lifecycle/products/windows-7)可延长至 2023 年 1 月 10 日
- 可安装 *第三方* 补丁整合包例如 **[UpdatePack7R2](https://cn.bing.com/search?q=UpdatePack7R2)** *或* 购买官方 ESU 产品密钥 解决
- 下载 api-ms-win-core-winrt-l1-1-0.dll 文件放入程序根目录(Steam++.exe 所在文件夹)
- [从 Github 上直接下载](https://github.com/BeyondDimension/SteamTools/raw/develop/references/runtime.win7-x64.Microsoft.NETCore.Windows.ApiSets/api-ms-win-core-winrt-l1-1-0.dll)
- [从 Gitee 上直接下载](https://gitee.com/rmbgame/SteamTools/raw/develop/references/runtime.win7-x64.Microsoft.NETCore.Windows.ApiSets/api-ms-win-core-winrt-l1-1-0.dll)
- [从 NuGet 上下载后提取](https://www.nuget.org/api/v2/package/runtime.win7-x64.Microsoft.NETCore.Windows.ApiSets/1.0.1)
- .nupkg 文件可使用解压工具打开或解压,找到此文件复制即可
[![steampp.net](https://img.shields.io/badge/WebSite-steampp.net-brightgreen.svg?style=flat-square&color=61dafb)](https://steampp.net)
[![Steam++ v2.7.0](https://img.shields.io/badge/Steam++-v2.7.0-brightgreen.svg?style=flat-square&color=512bd4)]()
[![Steam++ v2.6.9](https://img.shields.io/badge/Steam++-v2.6.9-brightgreen.svg?style=flat-square&color=512bd4)]()
##### [不知道该下载哪个文件?](./download-guide.md)
@@ -70,22 +63,21 @@
### 文件校验
| File | Checksum (SHA256) |
| ---- | ---- |
| Steam++_win_x64_v2.7.0.7z | SHA256 |
| Steam++_win_x64_fde_v2.7.0.7z | SHA256 |
| Steam++_win_x64_v2.6.9.7z | SHA256 |
| Steam++_win_x64_fde_v2.6.9.7z | SHA256 |
| | |
| Steam++_win_x64_v2.7.0.exe | SHA256 |
| Steam++_win_x64_fde_v2.7.0.exe | SHA256 |
| Steam++_win_x64_v2.6.9.exe | SHA256 |
| Steam++_win_x64_fde_v2.6.9.exe | SHA256 |
| | |
| Steam++_linux_x64_v2.7.0.7z | SHA256 |
| Steam++_linux_arm64_v2.7.0.7z | SHA256 |
| Steam++_linux_x64_v2.6.9.7z | SHA256 |
| Steam++_linux_arm64_v2.6.9.7z | SHA256 |
| | |
| Steam++_linux_x64_v2.7.0.deb | SHA256 |
| Steam++_linux_arm64_v2.7.0.deb | SHA256 |
| Steam++_linux_x64_v2.6.9.deb | SHA256 |
| Steam++_linux_arm64_v2.6.9.deb | SHA256 |
| | |
| Steam++_linux_x64_v2.7.0.rpm | SHA256 |
| Steam++_linux_arm64_v2.7.0.rpm | SHA256 |
| Steam++_linux_x64_v2.6.9.rpm | SHA256 |
| Steam++_linux_arm64_v2.6.9.rpm | SHA256 |
| | |
| Steam++_macos_x64_v2.7.0.dmg | SHA256 |
| Steam++_macos_arm64_v2.7.0.dmg | SHA256 |
| Steam++_macos_x64_v2.6.9.dmg | SHA256 |
| | |
| Steam++_android_v2.7.0.apk | SHA256 |
| Steam++_android_v2.6.9.apk | SHA256 |
+1 -4
View File
@@ -28,7 +28,7 @@ namespace System
public const string MainDllPath_ =
@"\src\" + ProjectDir_AvaloniaApp + @"\bin\{0}\Steam++.dll";
[Obsolete("use DirPublishWinX86_")]
[Obsolete("use DirPublishWinX86_", true)]
public const string DirPublishWinX86 =
@"\src\" + ProjectDir_AvaloniaApp + @"\bin\Release\Publish\win-x86";
@@ -46,9 +46,6 @@ namespace System
public const string DirPublishWinX64_ =
@"\src\" + ProjectDir_AvaloniaApp + @"\bin\{0}\Publish\win-x64";
public const string DirPublishOsx =
@"\src\" + ProjectDir_AvaloniaApp + @"\bin\Release\Publish\{0}";
public const string DirPublishWinX64_FDE_ =
@"\src\" + ProjectDir_AvaloniaApp + @"\bin\{0}\Publish\FrameworkDependent\win-x64";
Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 829 KiB

After

Width:  |  Height:  |  Size: 686 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 660 KiB

After

Width:  |  Height:  |  Size: 657 KiB

+12 -51
View File
@@ -151,24 +151,6 @@ namespace System.Application.UI
b.Append(platformService.IsInstall.ToLowerString());
b.AppendLine();
#if WINDOWS10_0_17763_0_OR_GREATER
if (OperatingSystem2.IsWindows10AtLeast)
{
try
{
#pragma warning disable CA1416 // 验证平台兼容性
var currentPackage = global::Windows.ApplicationModel.Package.Current;
var familyName = currentPackage.Id.FamilyName;
b.Append("[app.pkg] ");
b.Append(familyName);
b.AppendLine();
#pragma warning restore CA1416 // 验证平台兼容性
}
catch
{
}
}
#endif
b.Append("[memory.usage] ");
#if __ANDROID__
@@ -197,7 +179,6 @@ namespace System.Application.UI
b.Append(RuntimeInformation.ProcessArchitecture);
b.AppendLine();
#if MONOANDROID
b.Append("[clr.ver] ");
string? clrVersion;
try
@@ -213,16 +194,9 @@ namespace System.Application.UI
else
b.Append(clrVersion);
b.AppendLine();
#endif
#if __ANDROID__
#if V2RAY
b.Append("[v2ray.ver] ");
b.Append(Libv2ray.Libv2ray.CheckVersionX());
b.AppendLine();
#endif
//if (_ThisAssembly.Debuggable)
//{
// b.Append("[app.multi] ");
@@ -269,25 +243,18 @@ namespace System.Application.UI
static void GetStartTime(StringBuilder b)
{
string startTimeStr;
try
{
const string f = "yy-MM-dd HH:mm:ss";
const string f2 = "HH:mm:ss";
const string f3 = "dd HH:mm:ss";
var starttime = ArchiSteamFarm.Core.OS.ProcessStartTime;
starttime = starttime.ToLocalTime();
var utc_time = starttime.ToUniversalTime();
var local = TimeZoneInfo.Local;
startTimeStr = utc_time.Hour == starttime.Hour
? starttime.ToString(starttime.Year >= 2100 ? DateTimeFormat.Standard : f)
: utc_time.Day == starttime.Day
? $"{utc_time.ToString(f)}({starttime.ToString(f2)} {local.StandardName})"
: $"{utc_time.ToString(f)}({starttime.ToString(f3)} {local.StandardName})";
}
catch (Exception)
{
startTimeStr = string.Empty;
}
const string f = "yy-MM-dd HH:mm:ss";
const string f2 = "HH:mm:ss";
const string f3 = "dd HH:mm:ss";
var starttime = Process.GetCurrentProcess().StartTime;
starttime = starttime.ToLocalTime();
var utc_time = starttime.ToUniversalTime();
var local = TimeZoneInfo.Local;
startTimeStr = utc_time.Hour == starttime.Hour
? starttime.ToString(starttime.Year >= 2100 ? DateTimeFormat.Standard : f)
: utc_time.Day == starttime.Day
? $"{utc_time.ToString(f)}({starttime.ToString(f2)} {local.StandardName})"
: $"{utc_time.ToString(f)}({starttime.ToString(f3)} {local.StandardName})";
b.Append(startTimeStr);
}
b.AppendLine();
@@ -395,15 +362,9 @@ namespace System.Application.UI
b.Append(GetJavaSystemGetProperty("java.vm.version"));
b.AppendLine();
#if MONOANDROID
b.Append("[mono.ver] ");
b.Append(Mono.Runtime.GetDisplayName());
b.AppendLine();
#else
b.Append("[clr.ver] ");
b.Append(Environment.Version);
b.AppendLine();
#endif
b.Append("[kernel.ver] ");
b.Append(GetJavaSystemGetProperty("os.version"));
@@ -14,8 +14,4 @@
<PackageReference Include="Avalonia.Skia" Aliases="AvaloniaSkia" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="StyleCop.Analyzers" PrivateAssets="All" />
</ItemGroup>
</Project>
@@ -9,7 +9,6 @@ namespace Avalonia.Skia
public sealed class SKTypefaceCollection
{
readonly @this @this;
internal SKTypefaceCollection(@this @this)
{
this.@this = @this;
-4
View File
@@ -37,8 +37,4 @@
<LastGenOutput>SR.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<PackageReference Include="StyleCop.Analyzers" PrivateAssets="All" />
</ItemGroup>
</Project>
@@ -118,19 +118,19 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ExitCode_IsEmulator" xml:space="preserve">
<value>이 앱은 에뮬레이터에서 실행을 지원하지 않습니다.</value>
<value>이 앱은 에뮬레이터에서 실행을 지원하지 않습니다</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="ExitCode_IsRoot" xml:space="preserve">
<value>이 응용 프로그램은 루트 권한이있는 장치에서 실행할 수 없습니다</value>
<value>이 앱은 ROOT 권한이 있는 장치에서 실행을 지원하지 않습니다</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="ExitCode_IsVirtualApk" xml:space="preserve">
<value>이 응용 프로그램은 멀티 오픈을 지원하지 않습니다.</value>
<value>이 응용 프로그램은 멀티 오픈을 지원하지 않습니다</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="ExitCode_IsXposedExists" xml:space="preserve">
<value>이 응용 프로그램은 Xposed 프레임 워크가 설치된 장치에서 실행을 지원하지 않습니다.</value>
<value>이 앱은 Xposed 프레임워크가 설치된 장치에서 실행을 지원하지 않습니다</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
</root>
@@ -118,19 +118,19 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ExitCode_IsEmulator" xml:space="preserve">
<value>Это приложение невозможно запустить через эмулятор</value>
<comment>Comment=;Author=vanja-san</comment>
<value>Это приложение не поддерживает запуск в эмуляторе</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="ExitCode_IsRoot" xml:space="preserve">
<value>Это приложение невозможно запустить на устройствах с root правами</value>
<comment>Comment=;Author=vanja-san</comment>
<value>Это приложение не поддерживается для запуска на устройствах с привилегиями ROOT</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="ExitCode_IsVirtualApk" xml:space="preserve">
<value>Это приложение не поддерживает несколько окон</value>
<comment>Comment=;Author=vanja-san</comment>
<value>Это приложение не поддерживает мультиоткрытие</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="ExitCode_IsXposedExists" xml:space="preserve">
<value>Это приложение невозможно запустить на устройствах с установленным Xposed Framework</value>
<comment>Comment=;Author=vanja-san</comment>
<value>Это приложение не поддерживает запуск на устройствах с установленной платформой Xposed</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
</root>
@@ -55,9 +55,9 @@ namespace System.Application.Services.Implementation
Log.Error(TAG, e, "ShowDroidToast Error, text: {0}, IsMainThread: {1}", text, IsMainThread);
// 解决在子线程中调用Toast的异常情况处理
Looper.Prepare();
var toast_ = AndroidToast.MakeText(context, text, duration2)
var _toast = AndroidToast.MakeText(context, text, duration2)
?? throw new NullReferenceException("toast markeText Fail(2)");
SetTextAndShow(toast_, text);
SetTextAndShow(_toast, text);
Looper.Loop();
}
@@ -2,62 +2,33 @@ using Android.Runtime;
using Java.Security.Cert;
using System.IO;
using Xamarin.Android.Net;
using X509Certificate2 = System.Security.Cryptography.X509Certificates.X509Certificate2;
// ReSharper disable once CheckNamespace
namespace System
{
public static partial class HttpClientExtensions
{
const string certificateFileType = "X.509";
static readonly Lazy<CertificateFactory?> certificateFactory = new(() =>
{
var certificateFactory = CertificateFactory.GetInstance(certificateFileType);
return certificateFactory;
});
internal static CertificateFactory CertificateFactory
{
get
{
var certificateFactory = HttpClientExtensions.certificateFactory.Value;
if (certificateFactory == null)
throw new NullReferenceException(
$"CertificateFactory.GetInstance Fail, Type: {certificateFileType}");
return certificateFactory;
}
}
/// <summary>
/// 添加可信任证书,可用于调试时 HTTPS 抓包
/// 添加可信任证书,可用于调试时HTTPS抓包
/// </summary>
/// <param name="handler"></param>
/// <param name="certificateFileData">证书文件数据(文件流,内嵌资源流)</param>
/// <param name="certificateFileType">证书文件类型,默认使用X.509</param>
public static void AddTrustedCert(
this AndroidClientHandler handler,
Stream certificateFileData)
Stream certificateFileData,
string certificateFileType = "X.509")
{
var certificate = CertificateFactory.GenerateCertificate(certificateFileData);
var certificateFactory = CertificateFactory.GetInstance(certificateFileType);
if (certificateFactory == null)
throw new NullReferenceException(
$"CertificateFactory.GetInstance Fail, Type: {certificateFileType}");
var certificate = certificateFactory.GenerateCertificate(certificateFileData);
if (certificate == null)
throw new NullReferenceException("GenerateCertificate Fail");
if (handler.TrustedCerts == null)
handler.TrustedCerts = new JavaList<Certificate>();
handler.TrustedCerts.Add(certificate);
}
/// <summary>
/// 将 .NET 中的 X509 证书对象 转换为 JVM 中的 X509 证书对象
/// <para>Java.Security.Cert.X509Certificate</para>
/// <para>=></para>
/// <para>System.Security.Cryptography.X509Certificates.X509Certificate2</para>
/// </summary>
/// <param name="certificate2"></param>
/// <returns></returns>
public static X509Certificate Convert(this X509Certificate2 certificate2)
{
using var stream = new MemoryStream(certificate2.RawData);
return CertificateFactory.GenerateCertificate(stream)!.JavaCast<X509Certificate>();
}
}
}
@@ -22,8 +22,4 @@
<ProjectReference Include="..\Common.ClientLib\Common.ClientLib.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="StyleCop.Analyzers" PrivateAssets="All" />
</ItemGroup>
</Project>
@@ -1,126 +1,125 @@
//using System.Diagnostics;
//using System.Diagnostics.CodeAnalysis;
//using System.IO;
//using System.Linq;
//using System.Properties;
//using System.Reflection;
//using System.Security.Cryptography;
//using System.Text;
//using _ThisAssembly = System.Properties.ThisAssembly;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Properties;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using _ThisAssembly = System.Properties.ThisAssembly;
//namespace System.Application
//{
// [Obsolete]
// [DebuggerDisplay("{DebuggerDisplay(),nq}")]
// [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
// public sealed class AppClientAttribute : Attribute
// {
// string DebuggerDisplay() => $"type: {type}";
namespace System.Application
{
[DebuggerDisplay("{DebuggerDisplay(),nq}")]
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
public sealed class AppClientAttribute : Attribute
{
string DebuggerDisplay() => $"type: {type}";
// readonly Type? type;
// string? str;
readonly Type? type;
string? str;
// [NotNull, DisallowNull] // C# 8 not null
// public object? Value { get; private set; }
[NotNull, DisallowNull] // C# 8 not null
public object? Value { get; private set; }
// public AppClientAttribute(Type type, string str)
// {
// this.type = type;
// this.str = str;
// init();
// if (Value == null) throw new ArgumentNullException(nameof(Value));
// }
public AppClientAttribute(Type type, string str)
{
this.type = type;
this.str = str;
init();
if (Value == null) throw new ArgumentNullException(nameof(Value));
}
//#pragma warning disable IDE1006 // 命名样式
#pragma warning disable IDE1006 // 命名样式
// void init()
//#pragma warning restore IDE1006 // 命名样式
// {
// ctor();
void init()
#pragma warning restore IDE1006 // 命名样式
{
ctor();
// void ctor()
// {
//#if DEBUG
// var stopwatch = Stopwatch.StartNew();
//#endif
// Value = Serializable.DMPB64U(type.ThrowIsNull(nameof(type)), str)
// .ThrowIsNull(nameof(Value));
// str = null;
//#if DEBUG
// stopwatch.Stop();
// Debug.WriteLine($"AppClientAttr init 耗时:{stopwatch.ElapsedMilliseconds}ms");
//#endif
// }
// }
void ctor()
{
#if DEBUG
var stopwatch = Stopwatch.StartNew();
#endif
Value = Serializable.DMPB64U(type.ThrowIsNull(nameof(type)), str)
.ThrowIsNull(nameof(Value));
str = null;
#if DEBUG
stopwatch.Stop();
Debug.WriteLine($"AppClientAttr init 耗时:{stopwatch.ElapsedMilliseconds}ms");
#endif
}
}
// [return: MaybeNull]
// public static T Get<T>(Assembly? assembly = null)
// {
//#if DEBUG
// var stopwatch = Stopwatch.StartNew();
//#endif
// assembly ??= Assembly.GetCallingAssembly();
// var attrs = assembly.GetCustomAttributes<AppClientAttribute>();
// var type = typeof(T);
// var attr = attrs.FirstOrDefault(x => x.Value != null && x.type == type);
// var t = (attr != default && attr.Value is T value) ? value : default;
//#if DEBUG
// stopwatch.Stop();
// Debug.WriteLine($"AppClientAttr Get<{type.Name}> 耗时:{stopwatch.ElapsedMilliseconds}ms");
//#endif
// return t;
// }
[return: MaybeNull]
public static T Get<T>(Assembly? assembly = null)
{
#if DEBUG
var stopwatch = Stopwatch.StartNew();
#endif
assembly ??= Assembly.GetCallingAssembly();
var attrs = assembly.GetCustomAttributes<AppClientAttribute>();
var type = typeof(T);
var attr = attrs.FirstOrDefault(x => x.Value != null && x.type == type);
var t = (attr != default && attr.Value is T value) ? value : default;
#if DEBUG
stopwatch.Stop();
Debug.WriteLine($"AppClientAttr Get<{type.Name}> 耗时:{stopwatch.ElapsedMilliseconds}ms");
#endif
return t;
}
// public enum ResValueFormat : byte
// {
// String,
// StringGuidD,
// StringGuidN,
// }
public enum ResValueFormat : byte
{
String,
StringGuidD,
StringGuidN,
}
// public static string? GetResValue(Func<string, Stream?> func, string name, bool isSingle, string namespacePrefix, ResValueFormat format)
// {
// static string GetResFileName(string name, bool isSingle) => isSingle ? $"{name}.pfx" : $"{name}-{(_ThisAssembly.Debuggable ? "debug" : "release")}.pfx";
// static string GetResFileNameH(string name) => Hashs.String.Crc32(name, isLower: false);
// static string GetResFullName(string name, string namespacePrefix) => string.IsNullOrEmpty(namespacePrefix) ? name : namespacePrefix + name;
// static MemoryStream GetMemoryStream(Stream stream)
// {
// if (stream is not MemoryStream ms)
// {
// ms = new MemoryStream();
// stream.CopyTo(ms);
// }
// return ms;
// }
// static string ReadStream(Stream stream, ResValueFormat format)
// {
// if (format == ResValueFormat.String)
// {
// using var reader = new StreamReader(stream, EncodingCache.UTF8NoBOM);
// return reader.ReadToEnd();
// }
// if (format == ResValueFormat.StringGuidD || format == ResValueFormat.StringGuidN)
// {
// using var ms = GetMemoryStream(stream);
// var guid = new Guid(ms.ToArray());
// return format switch
// {
// ResValueFormat.StringGuidD => guid.ToString("D"),
// ResValueFormat.StringGuidN => guid.ToString("N"),
// _ => throw new ArgumentOutOfRangeException(nameof(format), format, null),
// };
// }
// else
// {
// throw new ArgumentOutOfRangeException(nameof(format), format, null);
// }
// }
// name = GetResFileName(name, isSingle);
// name = GetResFileNameH(name);
// name = GetResFullName(name, namespacePrefix);
// using var stream = func(name);
// if (stream != null) return ReadStream(stream, format);
// return null;
// }
// }
//}
public static string? GetResValue(Func<string, Stream?> func, string name, bool isSingle, string namespacePrefix, ResValueFormat format)
{
static string GetResFileName(string name, bool isSingle) => isSingle ? $"{name}.pfx" : $"{name}-{(_ThisAssembly.Debuggable ? "debug" : "release")}.pfx";
static string GetResFileNameH(string name) => Hashs.String.Crc32(name, isLower: false);
static string GetResFullName(string name, string namespacePrefix) => string.IsNullOrEmpty(namespacePrefix) ? name : namespacePrefix + name;
static MemoryStream GetMemoryStream(Stream stream)
{
if (stream is not MemoryStream ms)
{
ms = new MemoryStream();
stream.CopyTo(ms);
}
return ms;
}
static string ReadStream(Stream stream, ResValueFormat format)
{
if (format == ResValueFormat.String)
{
using var reader = new StreamReader(stream, EncodingCache.UTF8NoBOM);
return reader.ReadToEnd();
}
if (format == ResValueFormat.StringGuidD || format == ResValueFormat.StringGuidN)
{
using var ms = GetMemoryStream(stream);
var guid = new Guid(ms.ToArray());
return format switch
{
ResValueFormat.StringGuidD => guid.ToString("D"),
ResValueFormat.StringGuidN => guid.ToString("N"),
_ => throw new ArgumentOutOfRangeException(nameof(format), format, null),
};
}
else
{
throw new ArgumentOutOfRangeException(nameof(format), format, null);
}
}
name = GetResFileName(name, isSingle);
name = GetResFileNameH(name);
name = GetResFullName(name, namespacePrefix);
using var stream = func(name);
if (stream != null) return ReadStream(stream, format);
return null;
}
}
}
@@ -10,8 +10,6 @@ namespace System.Application
public const string Prefix_HTTP = "http://";
public const string Prefix_MSStore = "ms-windows-store://";
public const string Prefix_Email = "mailto:";
/// <summary>
/// 判断字符串是否为 Http Url
@@ -29,12 +27,5 @@ namespace System.Application
/// <param name="url"></param>
/// <returns></returns>
public static bool IsStoreUrl([NotNullWhen(true)] string? url) => url != null && url.StartsWith(Prefix_MSStore, StringComparison.OrdinalIgnoreCase);
/// <summary>
/// 判断字符串是否为 Email Url
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static bool IsEmailUrl([NotNullWhen(true)] string? url) => url != null && url.StartsWith(Prefix_Email, StringComparison.OrdinalIgnoreCase);
}
}
@@ -52,7 +52,7 @@ namespace System.Application
static OpenResultCode OpenAnalysis(string? url)
{
if (IsStoreUrl(url) || IsEmailUrl(url))
if (IsStoreUrl(url))
{
return OpenCoreByProcess(url);
}
@@ -9,7 +9,6 @@ namespace System.Application
public static class DeviceInfo2
{
static readonly Lazy<IDeviceInfoPlatformService?> @interface = new(DI.Get_Nullable<IDeviceInfoPlatformService>);
static IDeviceInfoPlatformService? Interface => @interface.Value;
/// <inheritdoc cref="DeviceInfo.Model"/>
@@ -161,10 +160,6 @@ namespace System.Application
{
return OSNames.Value.WSA;
}
else if (Interface != null && Interface.IsChromeOS)
{
return OSNames.Value.ChromeOS;
}
else
{
if (DeviceType == DeviceType.Virtual)
@@ -206,7 +201,6 @@ namespace System.Application
}
return default;
});
public static OSNames.Value OSNameValue => _OSNameValue.Value;
/// <inheritdoc cref="DeviceInfo.DeviceType"/>
@@ -94,7 +94,6 @@ namespace System.Application
}
static bool mIsFirstLaunchEver;
/// <summary>
/// 获取一个值,该值指示此应用是否首次在此设备上启动。
/// </summary>
@@ -111,7 +110,6 @@ namespace System.Application
return mIsFirstLaunchEver;
}
}
private set
{
mIsFirstLaunchEver = value;
@@ -119,7 +117,6 @@ namespace System.Application
}
static bool mIsFirstLaunchForCurrentVersion;
/// <summary>
/// 获取一个值,该值指示这是否是当前版本号的应用程序的首次启动。
/// </summary>
@@ -136,7 +133,6 @@ namespace System.Application
return mIsFirstLaunchForCurrentVersion;
}
}
private set
{
mIsFirstLaunchForCurrentVersion = value;
@@ -13,11 +13,10 @@ namespace System.Application.Services
string VersionString { get; }
DeviceType DeviceType { get; }
bool IsChromeOS { get; }
}
}
namespace System.Application.Services.Implementation
{
public abstract class DeviceInfoPlatformServiceImpl : IDeviceInfoPlatformService
@@ -31,7 +30,5 @@ namespace System.Application.Services.Implementation
public /*virtual*/ string VersionString => DeviceInfo.VersionString;
public virtual DeviceType DeviceType => DeviceInfo.DeviceType;
public virtual bool IsChromeOS => false;
}
}
@@ -0,0 +1,53 @@
namespace System.Application.Services
{
/// <summary>
/// 通知栏服务
/// </summary>
/// <typeparam name="TNotificationType"></typeparam>
/// <typeparam name="TEntrance"></typeparam>
public interface INotificationService<TNotificationType, TEntrance, TNotificationService>
where TNotificationType : notnull, Enum
where TEntrance : notnull, Enum
where TNotificationService : INotificationService<TNotificationType, TEntrance, TNotificationService>
{
/// <summary>
/// 获取是否有通知权限
/// </summary>
/// <returns></returns>
bool AreNotificationsEnabled();
/// <summary>
/// 显示通知
/// </summary>
/// <param name="text">通知内容</param>
/// <param name="notificationType">通知类型</param>
/// <param name="autoCancel"></param>
/// <param name="title">通知标题</param>
/// <param name="entrance">点击通知的入口点</param>
void Notify(
string text,
TNotificationType notificationType,
bool autoCancel = true,
string? title = default,
TEntrance? entrance = default);
/// <summary>
/// 取消通知
/// </summary>
/// <param name="notificationType"></param>
void Cancel(TNotificationType notificationType);
/// <summary>
/// 取消所有通知
/// </summary>
void CancelAll();
/// <summary>
/// 下载进度通知
/// </summary>
Progress<float> NotifyDownload(
Func<string> text,
TNotificationType notificationType,
string? title = default);
}
}
@@ -29,7 +29,7 @@ namespace System.Application.Services
if ((!string.IsNullOrWhiteSpace(value)) &&
(string.IsNullOrWhiteSpace(textBoxText) ||
(textBoxText.Length < value.Length &&
value[..textBoxText.Length] == textBoxText)))
value.Substring(0, textBoxText.Length) == textBoxText)))
{
return value;
}
@@ -9,16 +9,10 @@ namespace System.Application.Services.Implementation
/// <inheritdoc cref="ILocalDataProtectionProvider"/>
public abstract class LocalDataProtectionProviderBase : ILocalDataProtectionProvider
{
#pragma warning disable IDE1006 // 命名样式
#pragma warning disable SA1309 // Field names should not begin with underscore
readonly Lazy<Aes> _aes;
#pragma warning disable SA1300 // Element should begin with upper-case letter
#pragma warning disable IDE1006 // 命名样式
protected Aes aes => _aes.Value;
#pragma warning restore SA1300 // Element should begin with upper-case letter
#pragma warning restore SA1309 // Field names should not begin with underscore
#pragma warning restore IDE1006 // 命名样式
protected readonly LocalDataProtectionType defaultELocalDataProtectionType;
protected readonly IProtectedData protectedData;
protected readonly IDataProtectionProvider dataProtectionProvider;
@@ -24,7 +24,6 @@ namespace System.Application.Services.Implementation
if (sharedName == null) return GetId(key);
return $"{key}_{sharedName}_S";
}
public void PlatformClear(string? sharedName)
{
conn.Execute(Sql_Delete_Where_SharedName_Equals, sharedName ?? string.Empty);
@@ -47,8 +47,8 @@ namespace System.Application.Services.Implementation
void Show_()
{
if (intercept.OnShowExecuting(text)) return;
var duration_ = duration ?? CalcDurationByStringLength(text.Length);
PlatformShow(text, duration_);
var _duration = duration ?? CalcDurationByStringLength(text.Length);
PlatformShow(text, _duration);
}
}
catch (Exception e)
@@ -7,7 +7,6 @@ namespace System.Application.UI.ViewModels
protected virtual bool IgnoreIcon { get; }
protected TId? id;
/// <summary>
/// 唯一键
/// </summary>
@@ -29,7 +28,6 @@ namespace System.Application.UI.ViewModels
}
protected string title = string.Empty;
/// <summary>
/// 标题文本
/// </summary>
@@ -40,7 +38,6 @@ namespace System.Application.UI.ViewModels
}
protected TIcon? icon;
/// <summary>
/// 图标
/// </summary>
@@ -31,8 +31,4 @@
<ProjectReference Include="..\Repositories.sqlite-net-pcl\Repositories.sqlite-net-pcl.csproj" />
<ProjectReference Include="..\Common.CoreLib\Common.CoreLib.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="StyleCop.Analyzers" PrivateAssets="All" />
</ItemGroup>
</Project>
@@ -28,8 +28,10 @@ namespace System.Application.Models
if (mDataSource == null) mDataSource = new List<T>();
return mDataSource;
}
set => mDataSource = value;
set
{
mDataSource = value;
}
}
[MPKey(1)]
+1 -7
View File
@@ -92,11 +92,6 @@ namespace System.Application
/// Android 模拟器
/// </summary>
AndroidVirtual,
/// <summary>
/// https://github.com/chromeos
/// </summary>
ChromeOS,
}
public static string ToDisplayName(this Value value) => value == default ? string.Empty :
@@ -124,8 +119,7 @@ namespace System.Application
Value.AndroidDesktop or
Value.AndroidTV or
Value.AndroidWatch or
Value.AndroidVirtual or
Value.ChromeOS => true,
Value.AndroidVirtual => true,
_ => false,
};
}
@@ -120,8 +120,7 @@ namespace System.Application
/// <summary>
/// 黑名单
/// </summary>
public static readonly byte[] Blacklist = new byte[]
{
public static readonly byte[] Blacklist = new byte[] {
148, 149, 146, // 物联网号段
};
}
@@ -70,6 +70,7 @@ namespace System.Application.Services
/// <param name="requestUri"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
[Obsolete("use cached")]
Task<Stream?> GetImageStreamAsync(string requestUri, CancellationToken cancellationToken = default);
static string GetImagesCacheDirectory(string? channelType)
@@ -13,7 +13,7 @@ namespace System.Application.Services.Implementation
static readonly IDictionary<Type, object> validators = new Dictionary<Type, object>();
public static void AddColumnValidate<T>(Func<T, string?> validate)
=> validators.TryAdd(typeof(T), validate);
=> validators.Add(typeof(T), validate);
const string I = "I";
const string IReadOnly = "IReadOnly";
@@ -68,7 +68,7 @@ namespace System.Application.Settings
stream.Position = 0;
}
var data = Serializable.SMP(_settings);
stream.Write(data);
stream.Write(data, 0, data.Length);
//XamlServices.Save(stream, this._settings);
}
}
@@ -41,7 +41,6 @@ namespace System.Application.Settings
return _cached ? _value : Default;
}
set
{
if (_cached && Equals(_value, value)) return;
@@ -182,7 +181,6 @@ namespace System.Application.Settings
if (value == null) return;
ValueChanged += _handlers[value] = (sender, args) => value(sender, new PropertyChangedEventArgs(nameof(Value)));
}
remove
{
if (value == null) return;
@@ -22,7 +22,6 @@ namespace System.Application.Settings
protected static string GetLocalFilePath(string configName) => Path.Combine(IOPath.AppDataDirectory, configName);
static readonly Lazy<string> _LocalFilePath = new(() => GetLocalFilePath(ConfigName));
public static string LocalFilePath => _LocalFilePath.Value;
public static ISerializationProvider Local { get; } = new FileSettingsProvider(LocalFilePath);
@@ -82,7 +81,6 @@ namespace System.Application.Settings
}
static readonly Lazy<string> _CategoryName = new(() => typeof(TSettings).Name);
public static new string CategoryName => _CategoryName.Value;
static string GetKey(string propertyName) => $"{CategoryName}.{propertyName}";
@@ -3,7 +3,6 @@ namespace System.Application.Settings
public sealed class ValueChangedEventArgs<T> : EventArgs where T : notnull
{
public T? OldValue { get; }
public T? NewValue { get; }
public ValueChangedEventArgs(T? oldValue, T? newValue)
-4
View File
@@ -54,8 +54,4 @@
</None>
</ItemGroup>
<ItemGroup>
<PackageReference Include="StyleCop.Analyzers" PrivateAssets="All" />
</ItemGroup>
</Project>
@@ -10,8 +10,8 @@ namespace System
{
public static sbyte[] ToSByteArray(this byte[] buffer)
{
ReadOnlySpan<byte> buffer_ = buffer;
return buffer_.ToSByteArray();
ReadOnlySpan<byte> _buffer = buffer;
return _buffer.ToSByteArray();
}
public static sbyte[] ToSByteArray(this ReadOnlySpan<byte> buffer)
@@ -19,8 +19,8 @@ namespace System
public static byte[] ToByteArray(this sbyte[] buffer)
{
ReadOnlySpan<sbyte> buffer_ = buffer;
return buffer_.ToByteArray();
ReadOnlySpan<sbyte> _buffer = buffer;
return _buffer.ToByteArray();
}
public static byte[] ToByteArray(this ReadOnlySpan<sbyte> buffer)
@@ -113,16 +113,5 @@ namespace System
return new(stream, encoding, bufferSize, leaveOpen);
}
}
public static byte[] ToByteArray2(this Stream stream)
{
byte[] bytes = new byte[stream.Length];
stream.Seek(0, SeekOrigin.Begin);
stream.Read(bytes, 0, bytes.Length);
stream.Seek(0, SeekOrigin.Begin);
return bytes;
}
}
}
@@ -37,7 +37,7 @@ namespace System
yield break;
}
}
if (isDian || (item >= '0' && item <= '9'))
if (isDian || item >= '0' && item <= '9')
{
findChar = true;
yield return item;
@@ -52,14 +52,12 @@ namespace System
}
#region TryParse
/// <summary>
/// 尝试将数字的字符串表示形式转换为 双精度浮点型
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static decimal? TryParseDecimal(this string value) => decimal.TryParse(value, out var temp) ? temp : null;
/// <summary>
/// 尝试将数字的字符串表示形式转换为 双精度浮点型
/// </summary>
@@ -106,6 +106,7 @@ namespace System
Exception = exception;
}
public static readonly EventHandler<TaskLog> Occured = (sender, e) =>
{
const string format = @"Unhandled Exception occured from Task.Forget()
-10
View File
@@ -117,16 +117,6 @@ namespace System
public const string maFile = ".maFile";
public static readonly string[] ImageFileExtensions = new string[]
{
FileEx.BMP,
FileEx.JPG,
FileEx.JPEG,
FileEx.PNG,
FileEx.GIF,
FileEx.WEBP,
};
public static bool IsSupportedTextReader(string extension) =>
string.Equals(extension, JSON, StringComparison.OrdinalIgnoreCase) ||
string.Equals(extension, TXT, StringComparison.OrdinalIgnoreCase) ||
@@ -19,7 +19,7 @@ namespace System
/// </summary>
public static partial class VideoFormatEnumExtensions
{
static readonly Lazy<IReadOnlyDictionary<VideoFormat, string>> mEnumMime = new(() =>
static readonly Lazy<IReadOnlyDictionary<VideoFormat, string>> _enum_mime = new(() =>
{
var value = new Dictionary<VideoFormat, string>()
{
@@ -28,33 +28,31 @@ namespace System
};
return value;
});
static readonly Lazy<IReadOnlyDictionary<string, VideoFormat>> mMimeEnum = new(() =>
static readonly Lazy<IReadOnlyDictionary<string, VideoFormat>> _mime_enum = new(() =>
{
var value = EnumMime.ToDictionary(x => x.Value, x => x.Key, StringComparer.OrdinalIgnoreCase);
var value = enum_mime.ToDictionary(x => x.Value, x => x.Key, StringComparer.OrdinalIgnoreCase);
return value;
});
static IReadOnlyDictionary<VideoFormat, string> EnumMime => mEnumMime.Value;
static IReadOnlyDictionary<string, VideoFormat> MimeEnum => mMimeEnum.Value;
static IReadOnlyDictionary<VideoFormat, string> enum_mime => _enum_mime.Value;
static IReadOnlyDictionary<string, VideoFormat> mime_enum => _mime_enum.Value;
/// <summary>
/// 获取MIME
/// </summary>
/// <param name="videoFormat"></param>
/// <param name="imageFormat"></param>
/// <returns></returns>
/// <exception cref="ArgumentOutOfRangeException"></exception>
public static string GetMIME(this VideoFormat videoFormat)
{
if (EnumMime.ContainsKey(videoFormat)) return EnumMime[videoFormat];
if (enum_mime.ContainsKey(videoFormat)) return enum_mime[videoFormat];
throw new ArgumentOutOfRangeException(nameof(videoFormat), videoFormat, null);
}
public static VideoFormat? GetFormat(string? mime)
{
if (mime == null) return null;
if (MimeEnum.ContainsKey(mime)) return MimeEnum[mime];
if (mime_enum.ContainsKey(mime)) return mime_enum[mime];
return null;
}
}
+7 -161
View File
@@ -3,7 +3,6 @@ using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;
#if !NET35 && !NOT_XE
using System.Threading.Tasks;
@@ -41,16 +40,14 @@ namespace System
/// </summary>
/// <param name="dirPath"></param>
/// <param name="noRecursive"></param>
public static bool DirTryDelete(string dirPath, bool noRecursive = false)
public static void DirTryDelete(string dirPath, bool noRecursive = false)
{
try
{
Directory.Delete(dirPath, !noRecursive);
return true;
}
catch
{
return false;
}
}
@@ -102,16 +99,14 @@ namespace System
/// <para>通常用于删除缓存</para>
/// </summary>
/// <param name="filePath"></param>
public static bool FileTryDelete(string filePath)
public static void FileTryDelete(string filePath)
{
try
{
File.Delete(filePath);
return true;
}
catch
{
return false;
}
}
@@ -163,7 +158,7 @@ namespace System
}
/// <summary>
/// 初始化文件系统
/// (可选)初始化文件系统
/// </summary>
/// <param name="getAppDataDirectory">获取应用目录文件夹</param>
/// <param name="getCacheDirectory">获取缓存目录文件夹</param>
@@ -173,119 +168,31 @@ namespace System
IOPath.getCacheDirectory = getCacheDirectory;
}
/// <summary>
/// 带迁移的初始化文件系统,使用 <see cref="Directory.Move(string, string)"/> 或 xcopy 进行移动,如果迁移失败则回退源目录
/// </summary>
/// <param name="destAppDataPath">新的 AppData 文件夹路径</param>
/// <param name="destCachePath">新的 Cache 文件夹路径</param>
/// <param name="sourceAppDataPath">旧的 AppData 文件夹路径</param>
/// <param name="sourceCachePath">旧的 Cache 文件夹路径</param>
protected static void InitFileSystemWithMigrations(
string destAppDataPath, string destCachePath,
string sourceAppDataPath, string sourceCachePath)
{
bool ExistsNotEmptyDir(string path)
{
var exists = Directory.Exists(path);
if (DesktopBridge.IsRunningAsUwp)
{
if (path == destCachePath || path == sourceCachePath)
{
return false;
}
}
return exists && Directory.EnumerateFileSystemEntries(path).Any(); // 文件夹存在且不为空文件夹
}
var paths = new[] { destAppDataPath, destCachePath, };
var dict_paths = paths.ToDictionary(x => x, x => ExistsNotEmptyDir(x));
var dict_paths = paths.ToDictionary(x => x, x => Directory.Exists(x) && Directory.EnumerateFileSystemEntries(x).Any());
if (dict_paths.Values.All(x => !x))
{
var old_paths = new[] { sourceAppDataPath, sourceCachePath, };
if (old_paths.All(x => Directory.Exists(x) && Directory.EnumerateFileSystemEntries(x).Any())) // 迁移之前根目录上的文件夹
{
var isNotFirst = false;
for (int i = 0; i < old_paths.Length; i++)
{
var path = paths[i];
var old_path = old_paths[i];
try
{
if (!isNotFirst)
{
try
{
// 尝试搜索之前版本的进程将其结束
var currentProcess = Process.GetCurrentProcess();
var query = from x in Process.GetProcessesByName(currentProcess.ProcessName)
where x != currentProcess
let m = x.TryGetMainModule()
where m != null && m.FileName != currentProcess.TryGetMainModule()?.FileName
select x;
var process = query.ToArray();
foreach (var proces in process)
{
try
{
#if NETCOREAPP3_0_OR_GREATER
proces.Kill(true);
#else
proces.Kill();
#endif
}
catch
{
}
}
}
catch
{
}
isNotFirst = true;
}
try
{
Directory.Move(old_path, path);
}
catch
{
try
{
CopyDirectory(old_path, path);
}
catch
{
if (OperatingSystem2.IsWindows)
{
var psi = new ProcessStartInfo
{
FileName = "cmd.exe",
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardInput = true,
};
var p = Process.Start(psi);
p.Start();
p.StandardInput.WriteLine($"xcopy \"{old_path}\" \"{path}\" /y &exit");
p.WaitForExit(10000);
p.Kill();
}
else
{
throw;
}
}
}
Directory.Move(old_path, path);
dict_paths[path] = true;
}
catch
{
if (!DesktopBridge.IsRunningAsUwp)
{
// 跨卷移动失败或其他原因失败,使用旧的目录,并尝试删除创建的空文件夹
DirTryDelete(path);
}
// 跨卷移动失败或其他原因失败,使用旧的目录,并尝试删除创建的空文件夹
DirTryDelete(path);
paths[i] = old_path;
}
}
@@ -304,34 +211,6 @@ namespace System
string GetAppDataDirectory() => paths[0];
string GetCacheDirectory() => paths[1];
}
/// <summary>
/// 初始化文件系统,但优先使用旧目录上的文件夹,如果存在的话(允许空文件夹),不会进行文件迁移
/// </summary>
/// <param name="destAppDataPath">新的 AppData 文件夹路径</param>
/// <param name="destCachePath">新的 Cache 文件夹路径</param>
/// <param name="sourceAppDataPath">旧的 AppData 文件夹路径</param>
/// <param name="sourceCachePath">旧的 Cache 文件夹路径</param>
protected static void InitFileSystemUseDestFirst(
string destAppDataPath, string destCachePath,
string sourceAppDataPath, string sourceCachePath)
{
var paths = new[] { destAppDataPath, destCachePath, };
var old_paths = new[] { sourceAppDataPath, sourceCachePath, };
for (int i = 0; i < old_paths.Length; i++)
{
var item = old_paths[i];
if (Directory.Exists(item))
{
paths[i] = item;
}
}
InitFileSystem(GetAppDataDirectory, GetCacheDirectory);
string GetAppDataDirectory() => paths[0];
string GetCacheDirectory() => paths[1];
}
}
/// <summary>
@@ -581,38 +460,5 @@ namespace System
public const char UnixDirectorySeparatorChar = '/';
public const char WinDirectorySeparatorChar = '\\';
public static void CopyDirectory(string sourceDir, string destinationDir, bool recursive = true)
{
// Get information about the source directory
var dir = new DirectoryInfo(sourceDir);
// Check if the source directory exists
if (!dir.Exists)
throw new DirectoryNotFoundException($"Source directory not found: {dir.FullName}");
// Cache directories before we start copying
DirectoryInfo[] dirs = dir.GetDirectories();
// Create the destination directory
Directory.CreateDirectory(destinationDir);
// Get the files in the source directory and copy to the destination directory
foreach (FileInfo file in dir.GetFiles())
{
string targetFilePath = Path.Combine(destinationDir, file.Name);
file.CopyTo(targetFilePath);
}
// If recursive and copying subdirectories, recursively call this method
if (recursive)
{
foreach (DirectoryInfo subDir in dirs)
{
string newDestinationDir = Path.Combine(destinationDir, subDir.Name);
CopyDirectory(subDir.FullName, newDestinationDir, true);
}
}
}
}
}
@@ -25,7 +25,6 @@ namespace System.Net.Http
#endif
return UseWebProxy(proxy) ? proxy : null;
}
set
{
#if NETSTANDARD
@@ -63,13 +62,9 @@ namespace System.Net.Http
sealed class HttpNoProxy : IWebProxy
{
public static readonly HttpNoProxy Instance = new();
private HttpNoProxy() { }
public ICredentials? Credentials { get; set; }
public Uri? GetProxy(Uri destination) => null;
public bool IsBypassed(Uri host) => true;
}
@@ -80,13 +75,14 @@ namespace System.Net.Http
{
try
{
#if NETCOREAPP2_1_OR_GREATER
if (handler is SocketsHttpHandler s)
{
s.Proxy = proxy;
if (useProxy && s.UseProxy != useProxy) s.UseProxy = useProxy; // 仅启用代理时修改开关
return;
}
#if !NETSTANDARD
if (handler is SocketsHttpHandler s)
{
s.Proxy = proxy;
if (useProxy && s.UseProxy != useProxy) s.UseProxy = useProxy; // 仅启用代理时修改开关
}
else
#endif
if (handler is HttpClientHandler h)
{
+5 -10
View File
@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
@@ -133,16 +134,12 @@ namespace System.Net.Sockets
tcpTableRecords.Add(new TcpProcessRecord(
new IPAddress(tcpRow.localAddr),
new IPAddress(tcpRow.remoteAddr),
BitConverter.ToUInt16(new byte[2]
{
BitConverter.ToUInt16(new byte[2] {
tcpRow.localPort[1],
tcpRow.localPort[0]
}, 0),
BitConverter.ToUInt16(new byte[2]
{
tcpRow.localPort[0] }, 0),
BitConverter.ToUInt16(new byte[2] {
tcpRow.remotePort[1],
tcpRow.remotePort[0]
}, 0),
tcpRow.remotePort[0] }, 0),
tcpRow.owningPid, tcpRow.state));
tableRowPtr = (IntPtr)((long)tableRowPtr + Marshal.SizeOf(tcpRow));
}
@@ -238,7 +235,6 @@ namespace System.Net.Sockets
public MibTcpState State { get; set; }
int _ProcessId;
[DisplayName("Process ID")]
public int ProcessId
{
@@ -262,7 +258,6 @@ namespace System.Net.Sockets
}
Lazy<Process?>? _Process;
[DisplayName("Process")]
public Process? Process => _Process?.Value;
@@ -6,5 +6,4 @@ using static System.Properties.ThisAssembly;
[assembly: InternalsVisibleTo("System.Common.UnitTest.Droid" + PublicKey)]
[assembly: InternalsVisibleTo("System.Application.SteamTools.Client.UnitTest" + PublicKey)]
[assembly: InternalsVisibleTo("System.Application.SteamTools.Client.Desktop.UnitTest" + PublicKey)]
[assembly: InternalsVisibleTo("System.Application.SteamTools.Client.Droid.UnitTest" + PublicKey)]
[assembly: InternalsVisibleTo("System.Application.SteamTools.Client.Droid.UnitTest.App" + PublicKey)]
[assembly: InternalsVisibleTo("System.Application.SteamTools.Client.Droid.UnitTest" + PublicKey)]
+8 -8
View File
@@ -118,7 +118,7 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Age_" xml:space="preserve">
<value>{0}세</value>
<value>{0}</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="DayOfWeek_L0" xml:space="preserve">
@@ -178,27 +178,27 @@
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="Female" xml:space="preserve">
<value>여자</value>
<value>여성</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="He" xml:space="preserve">
<value>그</value>
<value>그는</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="Male" xml:space="preserve">
<value>남자</value>
<value>남성</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="NotSupported_FixedSizeCollection" xml:space="preserve">
<value>컬렉션은 고정 된 크기였습니다.</value>
<value>Collection was of a fixed size.</value>
<comment>Comment=https://github.com/dotnet/runtime/blob/v5.0.0-rc.1.20451.14/src/libraries/System.Private.CoreLib/src/Resources/Strings.resx#L2893;Author=MicrosoftTranslator</comment>
</data>
<data name="She" xml:space="preserve">
<value>그녀</value>
<value>그녀는</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="Unknown" xml:space="preserve">
<value>알려지지 않은</value>
<value>알 수 없습니다</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="UnsupportedPhoneNumberSegment_" xml:space="preserve">
@@ -206,7 +206,7 @@
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="OpenCoreByProcess_Win32Exception_" xml:space="preserve">
<value>웹 링크 열기 실패 0x{0}, 시도하기 전에 시스템 기본 브라우저를 설정하십시오.</value>
<value>웹 링크를 열지 못한 경우 0x{0} 시스템 기본 브라우저를 설정한 다음 다시 시도하십시오</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
</root>
+32 -32
View File
@@ -118,95 +118,95 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Age_" xml:space="preserve">
<value>Возраст: {0}</value>
<comment>Comment=;Author=vanja-san</comment>
<value>{0} лет</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="DayOfWeek_L0" xml:space="preserve">
<value>Воскресенье</value>
<comment>Comment=;Author=vanja-san</comment>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="DayOfWeek_L1" xml:space="preserve">
<value>Понедельник</value>
<comment>Comment=;Author=vanja-san</comment>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="DayOfWeek_L2" xml:space="preserve">
<value>Вторник</value>
<comment>Comment=;Author=vanja-san</comment>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="DayOfWeek_L3" xml:space="preserve">
<value>Среда</value>
<comment>Comment=;Author=vanja-san</comment>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="DayOfWeek_L4" xml:space="preserve">
<value>Четверг</value>
<comment>Comment=;Author=vanja-san</comment>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="DayOfWeek_L5" xml:space="preserve">
<value>Пятница</value>
<comment>Comment=;Author=vanja-san</comment>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="DayOfWeek_L6" xml:space="preserve">
<value>Суббота</value>
<comment>Comment=;Author=vanja-san</comment>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="DayOfWeek_S0" xml:space="preserve">
<value>Воскресенье</value>
<comment>Comment=;Author=vanja-san</comment>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="DayOfWeek_S1" xml:space="preserve">
<value>Понедельник</value>
<comment>Comment=;Author=vanja-san</comment>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="DayOfWeek_S2" xml:space="preserve">
<value>Вторник</value>
<comment>Comment=;Author=vanja-san</comment>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="DayOfWeek_S3" xml:space="preserve">
<value>Среда</value>
<comment>Comment=;Author=vanja-san</comment>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="DayOfWeek_S4" xml:space="preserve">
<value>Четверг</value>
<comment>Comment=;Author=vanja-san</comment>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="DayOfWeek_S5" xml:space="preserve">
<value>Пятница</value>
<comment>Comment=;Author=vanja-san</comment>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="DayOfWeek_S6" xml:space="preserve">
<value>Суббота</value>
<comment>Comment=;Author=vanja-san</comment>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="Female" xml:space="preserve">
<value>Женщина</value>
<comment>Comment=;Author=vanja-san</comment>
<value>женщина</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="He" xml:space="preserve">
<value>Он</value>
<comment>Comment=;Author=vanja-san</comment>
<value>он</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="Male" xml:space="preserve">
<value>Мужчина</value>
<comment>Comment=;Author=vanja-san</comment>
<value>мужчина</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="NotSupported_FixedSizeCollection" xml:space="preserve">
<value>Коллекция имела фиксированный размер.</value>
<comment>Comment=https://github.com/dotnet/runtime/blob/v5.0.0-rc.1.20451.14/src/libraries/System.Private.CoreLib/src/Resources/Strings.resx#L2893;Author=vanja-san</comment>
<value>Коллекция была фиксированного размера.</value>
<comment>Comment=https://github.com/dotnet/runtime/blob/v5.0.0-rc.1.20451.14/src/libraries/System.Private.CoreLib/src/Resources/Strings.resx#L2893;Author=MicrosoftTranslator</comment>
</data>
<data name="She" xml:space="preserve">
<value>Она</value>
<comment>Comment=;Author=vanja-san</comment>
<value>она</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="Unknown" xml:space="preserve">
<value>Неизвестно</value>
<comment>Comment=;Author=vanja-san</comment>
<value>Неизвестный</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="UnsupportedPhoneNumberSegment_" xml:space="preserve">
<value>Неподдерживаемые номера телефонов ({0})</value>
<comment>Comment=;Author=vanja-san</comment>
<value>Сегмент неподдерживаемых номеров мобильных телефонов ({0})</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
<data name="OpenCoreByProcess_Win32Exception_" xml:space="preserve">
<value>Невозможно открыть ссылку 0x{0}, повторите снова, после установки браузер по умолчанию.</value>
<comment>Comment=;Author=vanja-san</comment>
<value>Открыть веб-ссылку не удалось 0x{0}, пожалуйста, установите системный браузер по умолчанию перед попыткой</value>
<comment>Comment=;Author=MicrosoftTranslator</comment>
</data>
</root>
@@ -1,7 +0,0 @@
namespace System.Properties
{
partial class ThisAssembly
{
public static string DisplayTrademark => /*DesktopBridge.IsRunningAsUwp ? $"蒸汽++" :*/ AssemblyTrademark;
}
}
@@ -26,11 +26,9 @@ namespace System.Properties
#if NETSTANDARD2_1 || NETCOREAPP2_1_OR_GREATER
static readonly Lazy<bool> mIsBetaRelease = new(() => DynamicVersion.Contains(beta, StringComparison.Ordinal));
public static bool IsBetaRelease => mIsBetaRelease.Value;
static readonly Lazy<bool> mIsAlphaRelease = new(() => DynamicVersion.Contains(alpha, StringComparison.Ordinal));
public static bool IsAlphaRelease => mIsAlphaRelease.Value;
static readonly Lazy<string> mVersionDisplay = new(() =>
@@ -38,7 +36,6 @@ namespace System.Properties
Version version = new(Version);
return $"{version.ToString(3)}{(IsAlphaRelease ? " α" : (IsBetaRelease ? " β" : ""))}{(version.Revision <= 0 ? "" : " rev." + version.Revision)}";
});
public static string VersionDisplay => mVersionDisplay.Value;
#endif
}
@@ -12,7 +12,7 @@ namespace System.Properties
/// <item> macOS:\packaging\build-osx-app.sh &lt;CFBundleVersion&gt; &lt;CFBundleShortVersionString&gt; </item>
/// </list>
/// </summary>
public const string Version = "2.7.0";
public const string Version = "2.6.9";
//public const string InfoVersion = Version + "-beta";
}
@@ -15,7 +15,7 @@ namespace System.Properties
/// <summary>
/// 提供程序集的文本说明
/// </summary>
public const string AssemblyDescription = "「Steam++ 工具箱」是一个开源跨平台的多功能游戏工具箱。";
public const string AssemblyDescription = "「Steam++」是一个包含多种Steam工具功能的工具箱。";
/// <summary>
/// 定义程序集清单的版权自定义属性
@@ -1,19 +0,0 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/IsExternalInit.cs
// https://stackoverflow.com/questions/64749385/predefined-type-system-runtime-compilerservices-isexternalinit-is-not-defined
// https://stackoverflow.com/questions/62648189/testing-c-sharp-9-0-in-vs2019-cs0518-isexternalinit-is-not-defined-or-imported
// https://github.com/dotnet/roslyn/issues/45510
// https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.compilerservices.isexternalinit?view=net-6.0
#if NETSTANDARD2_1
using System.ComponentModel;
namespace System.Runtime.CompilerServices
{
[EditorBrowsable(EditorBrowsableState.Never)]
public class IsExternalInit
{
}
}
#endif
@@ -560,9 +560,9 @@ namespace System.Security.Cryptography
{
var uint16 = BitConverter.ToUInt16(data, 0);
var flags = (Flags)uint16;
var mIVByteArray = data.Skip(2).Take(16).ToArray();
var mKeyByteArray = data.Skip(18).Reverse().ToArray();
return new Parameters(mKeyByteArray, mIVByteArray, flags);
var IVByteArray = data.Skip(2).Take(16).ToArray();
var KeyByteArray = data.Skip(18).Reverse().ToArray();
return new Parameters(KeyByteArray, IVByteArray, flags);
}
public static Parameters Create(string data)
+2 -3
View File
@@ -126,9 +126,8 @@ namespace System
var formatting = writeIndented ? Formatting.Indented : Formatting.None;
var settings = ignoreNullValues ? new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
}
: null;
NullValueHandling = NullValueHandling.Ignore
} : null;
return SerializeObject(value, inputType, formatting, settings);
#endif
}
+4 -4
View File
@@ -350,8 +350,8 @@ namespace System
/// </summary>
public static bool operator ==(ShortGuid x, ShortGuid y)
{
//if (ReferenceEquals(x, null))
// return ReferenceEquals(y, null);
if (ReferenceEquals(x, null))
return ReferenceEquals(y, null);
return x.underlyingGuid == y.underlyingGuid;
}
@@ -361,8 +361,8 @@ namespace System
/// </summary>
public static bool operator ==(ShortGuid x, Guid y)
{
//if (ReferenceEquals(x, null))
// return ReferenceEquals(y, null);
if (ReferenceEquals(x, null))
return ReferenceEquals(y, null);
return x.underlyingGuid == y;
}
@@ -22,8 +22,4 @@
<ProjectReference Include="..\Common.PinyinLib\Common.PinyinLib.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="StyleCop.Analyzers" PrivateAssets="All" />
</ItemGroup>
</Project>
@@ -43,6 +43,7 @@ namespace System.Application.Services.Implementation
return Array.Empty<string>();
}
bool IPinyin.IsChinese(char c) => TransformMandarinLatin(c.ToString(), out var _);
}
}
@@ -25,8 +25,4 @@
</Reference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="StyleCop.Analyzers" PrivateAssets="All" />
</ItemGroup>
</Project>
@@ -1,15 +1,14 @@
<Project Sdk="MSBuild.Sdk.Extras">
<PropertyGroup>
<TargetFrameworks>MonoAndroid12.0;netstandard2.1;net6.0-android</TargetFrameworks>
<TargetFrameworks>MonoAndroid12.0;netstandard2.1</TargetFrameworks>
<RootNamespace>System</RootNamespace>
<AssemblyName>System.Common.PinyinLib.TinyPinyin</AssemblyName>
</PropertyGroup>
<PropertyGroup Condition=" $(TargetFramework.StartsWith('MonoAndroid')) Or $(TargetFramework.Contains('-android')) ">
<PropertyGroup Condition=" $(TargetFramework.StartsWith('MonoAndroid')) ">
<AndroidUseIntermediateDesignerFile>false</AndroidUseIntermediateDesignerFile>
<!--<IsBindingProject>true</IsBindingProject>-->
<DefineConstants>ANDROID;$(DefineConstants)</DefineConstants>
<IsBindingProject>true</IsBindingProject>
</PropertyGroup>
<ItemGroup>
@@ -28,32 +27,22 @@
<ProjectReference Include="..\Common.PinyinLib\Common.PinyinLib.csproj" />
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('MonoAndroid')) Or $(TargetFramework.Contains('-android')) ">
<!--<EmbeddedJar Include="Jars\ahocorasick-0.3.0.jar" />
<ItemGroup Condition=" $(TargetFramework.StartsWith('MonoAndroid')) ">
<EmbeddedJar Include="Jars\ahocorasick-0.3.0.jar" />
<EmbeddedJar Include="Jars\tinypinyin-2.0.3.jar" />
<EmbeddedJar Include="Jars\tinypinyin-android-asset-lexicons-2.0.3.jar" />
<LibraryProjectZip Include="Jars\tinypinyin-lexicons-android-cncity-2.0.3.aar" />
<TransformFile Include="Transforms\Metadata.xml" />-->
<PackageReference Include="XAB.TinyPinyin" />
<TransformFile Include="Transforms\Metadata.xml" />
</ItemGroup>
<ItemGroup Condition=" !($(TargetFramework.StartsWith('MonoAndroid')) Or $(TargetFramework.Contains('-android'))) ">
<!--<Compile Remove="Jars\**" />
<ItemGroup Condition=" !$(TargetFramework.StartsWith('MonoAndroid')) ">
<Compile Remove="Jars\**" />
<EmbeddedResource Remove="Jars\**" />
<None Remove="Jars\**" />
<Compile Remove="Transforms\**" />
<EmbeddedResource Remove="Transforms\**" />
<None Remove="Transforms\**" />-->
<None Remove="Transforms\**" />
<PackageReference Include="TinyPinyin.Net" />
</ItemGroup>
<!--<ItemGroup Condition=" $(TargetFramework.StartsWith('MonoAndroid')) ">
<Compile Remove="obj\Debug\net6.0-android\**" />
<Compile Remove="obj\Release\net6.0-android\**" />
</ItemGroup>-->
<ItemGroup>
<PackageReference Include="StyleCop.Analyzers" PrivateAssets="All" />
</ItemGroup>
</Project>
+69
View File
@@ -0,0 +1,69 @@
#if MONOANDROID
using Org.Ahocorasick.Trie;
using System;
using System.Collections;
using System.Collections.Generic;
using static TinyPinyin.ReflectUtils;
namespace TinyPinyin
{
/// <summary>
/// 字符串转拼音引擎,支持字典和 <see cref="ISegmentationSelector"/>
/// </summary>
partial class Engine
{
static readonly Lazy<Java.Util.IComparator> _EMIT_COMPARATOR = new(() => GetStaticField<Java.Util.IComparator>(nameof(EMIT_COMPARATOR))() ?? throw new ArgumentNullException(nameof(EMIT_COMPARATOR)));
public static Java.Util.IComparator EMIT_COMPARATOR => _EMIT_COMPARATOR.Value;
public static string[]? PinyinFromDict(string wordInDict, IList<IPinyinDict> pinyinDictSet)
{
if (pinyinDictSet != null)
{
foreach (var dict in pinyinDictSet)
{
var words = dict?.Words();
if (words != null && words.Contains(wordInDict))
{
return dict!.ToPinyin(wordInDict);
}
}
}
throw new Java.Lang.IllegalArgumentException($"No pinyin dict contains word: {wordInDict}");
}
public static IEnumerable<string> GetPinyinArray(string s, Trie trie, IList<IPinyinDict> pinyinDictList, ISegmentationSelector selector)
{
// https://github.com/promeG/TinyPinyin/blob/v2.0.3/lib/src/main/java/com/github/promeg/pinyinhelper/Engine.java#L44
var selectedEmits = selector.Select(trie.ParseText(s))!;
Java.Util.Collections.Sort((IList)selectedEmits!, EMIT_COMPARATOR);
int nextHitIndex = 0;
for (int i = 0; i < s.Length;)
{
// 首先确认是否有以第i个字符作为begin的hit
if (nextHitIndex < selectedEmits.Count && i == selectedEmits[nextHitIndex].Start)
{
// 有以第i个字符作为begin的hit
var fromDicts = PinyinFromDict(selectedEmits[nextHitIndex].Keyword!, pinyinDictList!)!;
for (int j = 0; j < fromDicts.Length; j++)
{
yield return fromDicts[j].ToUpper();
}
i += selectedEmits[nextHitIndex].Size();
nextHitIndex++;
}
else
{
// 将第i个字符转为拼音
yield return PinyinHelper.GetPinyin(s[i]) ?? string.Empty;
i++;
}
}
}
}
}
#endif
@@ -0,0 +1,12 @@
#if MONOANDROID
namespace TinyPinyin
{
/// <summary>
/// 分词选择算法应实现的接口
/// </summary>
partial interface ISegmentationSelector
{
}
}
#endif
@@ -0,0 +1,11 @@
# [TinyPinyin](https://github.com/promeG/TinyPinyin)
[ ![Download](https://api.bintray.com/packages/promeg/maven/tinypinyin/images/download.svg) ](https://bintray.com/promeg/maven/tinypinyin/_latestVersion)
适用于Java和Android的快速、低内存占用的汉字转拼音库。
## 依赖项
❌ android.support.*
## 升级注意事项
无
@@ -0,0 +1,22 @@
#if MONOANDROID
using Android.Runtime;
namespace Org.Ahocorasick.Interval
{
partial class IntervalableComparatorByPosition
{
int Java.Util.IComparator.Compare(Java.Lang.Object? o1, Java.Lang.Object? o2)
{
return Compare(o1.JavaCast<IIntervalable>(), o2.JavaCast<IIntervalable>());
}
}
partial class IntervalableComparatorBySize
{
int Java.Util.IComparator.Compare(Java.Lang.Object? o1, Java.Lang.Object? o2)
{
return Compare(o1.JavaCast<IIntervalable>(), o2.JavaCast<IIntervalable>());
}
}
}
#endif
@@ -0,0 +1,71 @@
#if MONOANDROID
using System;
using System.Collections.Generic;
using System.Linq;
using Android.Content;
using Org.Ahocorasick.Trie;
using static TinyPinyin.ReflectUtils;
namespace TinyPinyin
{
partial class PinyinHelper
{
static readonly Lazy<Func<Trie?>> mTrieDict = new(() => GetStaticField<Trie>(nameof(mTrieDict)));
public static Trie? TrieDict => mTrieDict.Value();
static readonly Lazy<Func<ISegmentationSelector?>> mSelector = new(() => GetStaticField<ISegmentationSelector>(nameof(mSelector)));
public static ISegmentationSelector? Selector => mSelector.Value();
static readonly Lazy<Func<IList<IPinyinDict>?>> mPinyinDicts = new(() => GetStaticField<IList<IPinyinDict>>(nameof(mPinyinDicts)));
public static IList<IPinyinDict>? PinyinDicts => mPinyinDicts.Value();
/// <summary>
/// 使用 <see cref="CnCityDict"/> 初始化拼音库
/// </summary>
/// <param name="context"></param>
public static void InitWithCnCityDict(Context context)
{
var dict = CnCityDict.GetInstance(context);
var config = NewConfig()!.With(dict);
Init(config);
}
/// <summary>
/// 初始化拼音库
/// </summary>
public static void Init()
{
var config = NewConfig();
Init(config);
}
/// <summary>
/// 初始化拼音库
/// </summary>
/// <param name="action"></param>
public static void Init(Action<Config> action)
{
var config = NewConfig()!;
action(config);
Init(config);
}
/// <summary>
/// 使用词典初始化拼音库
/// </summary>
/// <param name="dicts"></param>
public static void InitWithDicts(params IPinyinDict[] dicts)
{
var config = NewConfig()!;
if (dicts.Any())
{
foreach (var dict in dicts)
{
config.With(dict);
}
}
Init(config);
}
}
}
#endif
+6 -108
View File
@@ -1,9 +1,5 @@
using System.Linq;
using System.Collections.Generic;
using TinyPinyin;
#if MONOANDROID || ANDROID
using Org.AhoCorasick.Trie;
#endif
// ReSharper disable once CheckNamespace
namespace System.Application.Services.Implementation
@@ -11,13 +7,10 @@ namespace System.Application.Services.Implementation
/// <summary>
/// 使用 <see cref="PinyinHelper"/>(https://github.com/promeG/TinyPinyin) or (https://github.com/hueifeng/TinyPinyin.Net) 实现的拼音功能
/// </summary>
internal sealed partial class PinyinImpl : IPinyin
internal sealed class PinyinImpl : IPinyin
{
static string GetPinyin(string str, string separator)
{
string? value = PinyinHelper.GetPinyin(str, separator);
return value ?? string.Empty;
}
=> PinyinHelper.GetPinyin(str, separator) ?? string.Empty;
string IPinyin.GetPinyin(string s, PinyinFormat format) => format switch
{
@@ -26,117 +19,22 @@ namespace System.Application.Services.Implementation
_ => throw new ArgumentOutOfRangeException(nameof(format), format, null),
};
bool IPinyin.IsChinese(char c)
{
return PinyinHelper.IsChinese(c);
}
static string? GetPinyin(char c)
{
return PinyinHelper.GetPinyin(c);
}
#if MONOANDROID || ANDROID
static IEnumerable<string> GetPinyinArray(string s, Trie trie, IList<IPinyinDict> pinyinDictList, ISegmentationSelector selector)
{
// https://github.com/promeG/TinyPinyin/blob/v2.0.3/lib/src/main/java/com/github/promeg/pinyinhelper/Engine.java#L44
var selectedEmits = Engine.Select(s, trie, selector)!;
int nextHitIndex = 0;
for (int i = 0; i < s.Length;)
{
// 首先确认是否有以第i个字符作为begin的hit
if (nextHitIndex < selectedEmits.Count && i == selectedEmits[nextHitIndex].Start)
{
// 有以第i个字符作为begin的hit
var fromDicts = Engine.PinyinFromDict(selectedEmits[nextHitIndex].Keyword!, pinyinDictList!)!;
for (int j = 0; j < fromDicts.Length; j++)
{
yield return fromDicts[j].ToUpper();
}
i += selectedEmits[nextHitIndex].Size();
nextHitIndex++;
}
else
{
// 将第i个字符转为拼音
yield return GetPinyin(s[i]) ?? string.Empty;
i++;
}
}
}
static PinyinHelper.Config NewConfig() => PinyinHelper.NewConfig()!;
static void Init(PinyinHelper.Config? config) => PinyinHelper.Init(config);
/// <summary>
/// 使用 CnCityDict 初始化拼音库
/// </summary>
/// <param name="context"></param>
public static void InitWithCnCityDict(Android.Content.Context context)
{
var config = NewConfig();
var dict = new CnCityDict(context, CnCityDict.DefaultAssetFileName);
config = config.With(dict);
Init(config);
}
///// <summary>
///// 初始化拼音库
///// </summary>
//public static void Init()
//{
// var config = NewConfig();
// Init(config);
//}
///// <summary>
///// 初始化拼音库
///// </summary>
///// <param name="action"></param>
//public static void Init(Action<PinyinHelper.Config> action)
//{
// var config = NewConfig()!;
// action(config);
// Init(config);
//}
///// <summary>
///// 使用词典初始化拼音库
///// </summary>
///// <param name="dicts"></param>
//public static void InitWithDicts(params IPinyinDict[] dicts)
//{
// var config = NewConfig()!;
// if (dicts.Any())
// {
// foreach (var dict in dicts)
// {
// config.With(dict);
// }
// }
// Init(config);
//}
#endif
bool IPinyin.IsChinese(char c) => PinyinHelper.IsChinese(c);
string[] IPinyin.GetPinyinArray(string s)
{
if (string.IsNullOrEmpty(s)) return Array.Empty<string>();
#if MONOANDROID || ANDROID
#if MONOANDROID
var trie = PinyinHelper.TrieDict;
var selector = PinyinHelper.Selector;
var pinyinDictList = PinyinHelper.PinyinDicts;
if (trie != null && selector != null && pinyinDictList != null)
{
return GetPinyinArray(s, trie, pinyinDictList, selector).ToArray();
return Engine.GetPinyinArray(s, trie, pinyinDictList, selector).ToArray();
}
#endif
// 没有提供字典或选择器,按单字符转换输出
return s.Select(x => GetPinyin(x) ?? string.Empty).ToArray();
return s.Select(x => PinyinHelper.GetPinyin(x) ?? string.Empty).ToArray();
}
}
}
@@ -0,0 +1,26 @@
#if MONOANDROID
using System;
namespace TinyPinyin
{
internal static class ReflectUtils
{
public static Func<T?> GetStaticField<T>(string fieldName) where T : notnull
{
var field = Java.Lang.Class.FromType(typeof(PinyinHelper)).GetDeclaredField(fieldName);
if (field != null)
{
return () =>
{
if (field.Get(null) is T value)
{
return value;
}
return default;
};
}
return () => default;
}
}
}
#endif

Some files were not shown because too many files have changed in this diff Show More