Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@ jobs:
- name: Checkout
uses: actions/checkout@v6

- name: Setup .NET 8 SDK
- name: Setup .NET 9 SDK
uses: actions/setup-dotnet@v5
with:
dotnet-version: 8.0.x
dotnet-version: 9.0.x

- name: Cache NuGet packages
uses: actions/cache@v5
Expand Down Expand Up @@ -92,10 +92,10 @@ jobs:
- name: Checkout
uses: actions/checkout@v6

- name: Setup .NET 8 SDK
- name: Setup .NET 9 SDK
uses: actions/setup-dotnet@v5
with:
dotnet-version: 8.0.x
dotnet-version: 9.0.x

- name: Restore
run: dotnet restore SysManager/SysManager.UITests/SysManager.UITests.csproj
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ jobs:
- name: Checkout
uses: actions/checkout@v6

- name: Setup .NET 8 SDK
- name: Setup .NET 9 SDK
uses: actions/setup-dotnet@v5
with:
dotnet-version: 8.0.x
dotnet-version: 9.0.x

- name: Initialize CodeQL
uses: github/codeql-action/init@v4
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ jobs:
with:
ref: ${{ inputs.tag || github.ref }}

- name: Setup .NET 8 SDK
- name: Setup .NET 9 SDK
uses: actions/setup-dotnet@v5
with:
dotnet-version: 8.0.x
dotnet-version: 9.0.x

- name: Extract tag version
id: version
Expand Down
2 changes: 1 addition & 1 deletion ARCHITECTURE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Architecture

SysManager is a tabbed WPF desktop app on .NET 8, written in C# 12. It follows
SysManager is a tabbed WPF desktop app on .NET 9, written in C# 13. It follows
a standard MVVM layout with a thin service layer that wraps Windows APIs,
PowerShell, and external CLIs (winget, Ookla `speedtest`). It's gamer-focused:
network presets for CS2 / PUBG / Streaming and safe cleanup for Steam / Epic
Expand Down
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,24 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [0.47.0] - 2026-05-13

### Changed
- **Migrate to .NET 9** — all projects now target `net9.0-windows`. CI
workflows updated to use .NET 9 SDK. `Microsoft.Extensions.DependencyInjection`
bumped to 9.0.4. Closes #257.
- **DI: PowerShellRunner is now Transient** — each ViewModel gets its own
instance to prevent LineReceived event cross-talk between tabs.

### Fixed
- **Uninstaller** — filter out entries with names shorter than 2 characters
(eliminates empty rows from winget list parsing edge cases).
- **Process Manager** — explicitly enable column resizing (`CanUserResizeColumns`).
- **Windows Features** — show "Not elevated" warning badge when not running
as Administrator.
- **SpeedTestService** — suppress SYSLIB0057 obsolete warning for
`CreateFromSignedFile` (no .NET 9 replacement for Authenticode verification).

## [0.46.0] - 2026-05-13

### Added
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ recommended mitigation — see [SECURITY.md](SECURITY.md) for details.

## Build from source

Prerequisites: Windows 10 or newer and the [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0).
Prerequisites: Windows 10 or newer and the [.NET 9 SDK](https://dotnet.microsoft.com/download/dotnet/9.0).

```powershell
git clone https://github.com/laurentiu021/SystemManager.git
Expand Down Expand Up @@ -447,7 +447,7 @@ and elevation state in a format ready to paste into a bug report.

## Tech stack

- .NET 8 (WPF, C# 12)
- .NET 9 (WPF, C# 13)
- CommunityToolkit.Mvvm for MVVM plumbing
- ModernWpfUI for the modern title bar
- LiveCharts2 for the real-time latency chart
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<TargetFramework>net9.0-windows</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
Expand Down
2 changes: 1 addition & 1 deletion SysManager/SysManager.Tests/SysManager.Tests.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<TargetFramework>net9.0-windows</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
Expand Down
2 changes: 1 addition & 1 deletion SysManager/SysManager.UITests/SysManager.UITests.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<TargetFramework>net9.0-windows</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
Expand Down
6 changes: 4 additions & 2 deletions SysManager/SysManager/ServiceRegistration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ public static class ServiceRegistration
{
public static IServiceCollection ConfigureServices(this IServiceCollection services)
{
// ── Core services (Singleton — one shared instance) ─────────────
services.AddSingleton<PowerShellRunner>();
// ── Core services ──────────────────────────────────────────────
// PowerShellRunner is Transient — each consumer gets its own instance
// to avoid LineReceived event cross-talk between tabs.
services.AddTransient<PowerShellRunner>();
services.AddSingleton<SystemInfoService>();
services.AddSingleton<WingetService>();
services.AddSingleton<TrayIconService>();
Expand Down
2 changes: 2 additions & 0 deletions SysManager/SysManager/Services/SpeedTestService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,9 @@ await Task.Run(() =>
{
try
{
#pragma warning disable SYSLIB0057 // CreateFromSignedFile is obsolete — no direct replacement for Authenticode verification
var cert = System.Security.Cryptography.X509Certificates.X509Certificate.CreateFromSignedFile(exe);
#pragma warning restore SYSLIB0057
if (cert == null || !cert.Subject.Contains("Ookla", StringComparison.OrdinalIgnoreCase))
Log.Warning("Ookla speedtest.exe Authenticode subject mismatch: {Subject}", cert?.Subject ?? "none");
else
Expand Down
2 changes: 1 addition & 1 deletion SysManager/SysManager/Services/UninstallerService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ string Slice(int start, int end) =>
var source = idxSource > 0 ? Slice(idxSource, -1) : "";

if (string.IsNullOrWhiteSpace(id)) continue;
if (string.IsNullOrWhiteSpace(name)) continue;
if (string.IsNullOrWhiteSpace(name) || name.Length < 2) continue;

apps.Add(new InstalledApp
{
Expand Down
4 changes: 2 additions & 2 deletions SysManager/SysManager/SysManager.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<TargetFramework>net9.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UseWPF>true</UseWPF>
Expand Down Expand Up @@ -36,7 +36,7 @@
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.2" />
<PackageReference Include="H.NotifyIcon.Wpf" Version="2.2.1" />
<PackageReference Include="LiveChartsCore.SkiaSharpView.WPF" Version="2.0.2" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.4" />
<PackageReference Include="ModernWpfUI" Version="0.9.6" />
<PackageReference Include="Serilog" Version="4.3.1" />
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
Expand Down
1 change: 1 addition & 0 deletions SysManager/SysManager/Views/ProcessManagerView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
GridLinesVisibility="None" IsReadOnly="True"
RowBackground="Transparent" AlternatingRowBackground="#0F141C"
SelectionMode="Single" CanUserSortColumns="True"
CanUserResizeColumns="True"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling">
<DataGrid.Columns>
Expand Down
4 changes: 4 additions & 0 deletions SysManager/SysManager/Views/WindowsFeaturesView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@
Visibility="{Binding IsElevated, Converter={StaticResource BoolToVis}}">
<TextBlock Text="✓ Administrator" FontSize="11" Foreground="#4ADE80"/>
</Border>
<Border Background="#2D1F1F" CornerRadius="4" Padding="6,2" Margin="4,0"
Visibility="{Binding IsElevated, Converter={StaticResource BoolToVis}, ConverterParameter=Inverse}">
<TextBlock Text="⚠ Not elevated — toggle disabled" FontSize="11" Foreground="#F59E0B"/>
</Border>
</WrapPanel>
</Border>

Expand Down
Loading