Skip to content

Commit 1c5cbd8

Browse files
committed
Initial commit: CodingWithCalvin.VSToolbox WinUI 3 application
- WinUI 3 MSIX packaged application with Windows App SDK 1.8 - System tray icon support with H.NotifyIcon.WinUI - Visual Studio detection service using vswhere.exe - Support for VS 2019, 2022, and 2026 (all SKUs) - MVVM architecture with CommunityToolkit.Mvvm - .NET 10 / C# preview
0 parents  commit 1c5cbd8

47 files changed

Lines changed: 2076 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# Claude Code
2+
.claude/
3+
4+
# Build results
5+
[Bb]in/
6+
[Oo]bj/
7+
[Ll]og/
8+
[Ll]ogs/
9+
10+
# Visual Studio
11+
.vs/
12+
*.user
13+
*.suo
14+
*.userosscache
15+
*.sln.docstates
16+
17+
# JetBrains Rider
18+
.idea/
19+
*.sln.iml
20+
21+
# NuGet
22+
*.nupkg
23+
*.snupkg
24+
**/[Pp]ackages/*
25+
!**/[Pp]ackages/build/
26+
27+
# MSTest
28+
[Tt]est[Rr]esult*/
29+
[Bb]uild[Ll]og.*
30+
31+
# Windows Store app package directories
32+
AppPackages/
33+
BundleArtifacts/
34+
Package.StoreAssociation.xml
35+
_pkginfo.txt
36+
*.appx
37+
*.appxbundle
38+
*.appxupload
39+
40+
# OS generated files
41+
.DS_Store
42+
Thumbs.db
43+
44+
# User-specific files
45+
*.rsuser
46+
*.csproj.user
47+
*.dbmdl
48+
49+
# Windows image file caches
50+
Thumbs.db
51+
ehthumbs.db
52+
53+
# Generated files
54+
Generated\ Files/
55+
56+
# Publish profiles
57+
PublishScripts/
58+
*.pubxml
59+
!**/[Pp]ublish[Pp]rofiles/*.pubxml
60+
61+
# dotenv files
62+
.env
63+
.env.*
64+
!.env.example
65+
66+
# Local settings
67+
appsettings.*.json
68+
!appsettings.Development.json

CodingWithCalvin.VSToolbox.sln

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
# Visual Studio Version 17
4+
VisualStudioVersion = 17.0.31903.59
5+
MinimumVisualStudioVersion = 10.0.40219.1
6+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}"
7+
EndProject
8+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodingWithCalvin.VSToolbox", "src\CodingWithCalvin.VSToolbox\CodingWithCalvin.VSToolbox.csproj", "{8232D69B-C021-491A-A5E7-F3BE90F3EEB3}"
9+
EndProject
10+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodingWithCalvin.VSToolbox.Core", "src\CodingWithCalvin.VSToolbox.Core\CodingWithCalvin.VSToolbox.Core.csproj", "{16DB9C04-0293-44A5-8682-AD4468C47298}"
11+
EndProject
12+
Global
13+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
14+
Debug|Any CPU = Debug|Any CPU
15+
Debug|x64 = Debug|x64
16+
Debug|x86 = Debug|x86
17+
Release|Any CPU = Release|Any CPU
18+
Release|x64 = Release|x64
19+
Release|x86 = Release|x86
20+
EndGlobalSection
21+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
22+
{8232D69B-C021-491A-A5E7-F3BE90F3EEB3}.Debug|Any CPU.ActiveCfg = Debug|x86
23+
{8232D69B-C021-491A-A5E7-F3BE90F3EEB3}.Debug|Any CPU.Build.0 = Debug|x86
24+
{8232D69B-C021-491A-A5E7-F3BE90F3EEB3}.Debug|x64.ActiveCfg = Debug|x64
25+
{8232D69B-C021-491A-A5E7-F3BE90F3EEB3}.Debug|x64.Build.0 = Debug|x64
26+
{8232D69B-C021-491A-A5E7-F3BE90F3EEB3}.Debug|x86.ActiveCfg = Debug|x86
27+
{8232D69B-C021-491A-A5E7-F3BE90F3EEB3}.Debug|x86.Build.0 = Debug|x86
28+
{8232D69B-C021-491A-A5E7-F3BE90F3EEB3}.Release|Any CPU.ActiveCfg = Release|x86
29+
{8232D69B-C021-491A-A5E7-F3BE90F3EEB3}.Release|Any CPU.Build.0 = Release|x86
30+
{8232D69B-C021-491A-A5E7-F3BE90F3EEB3}.Release|x64.ActiveCfg = Release|x64
31+
{8232D69B-C021-491A-A5E7-F3BE90F3EEB3}.Release|x64.Build.0 = Release|x64
32+
{8232D69B-C021-491A-A5E7-F3BE90F3EEB3}.Release|x86.ActiveCfg = Release|x86
33+
{8232D69B-C021-491A-A5E7-F3BE90F3EEB3}.Release|x86.Build.0 = Release|x86
34+
{16DB9C04-0293-44A5-8682-AD4468C47298}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
35+
{16DB9C04-0293-44A5-8682-AD4468C47298}.Debug|Any CPU.Build.0 = Debug|Any CPU
36+
{16DB9C04-0293-44A5-8682-AD4468C47298}.Debug|x64.ActiveCfg = Debug|Any CPU
37+
{16DB9C04-0293-44A5-8682-AD4468C47298}.Debug|x64.Build.0 = Debug|Any CPU
38+
{16DB9C04-0293-44A5-8682-AD4468C47298}.Debug|x86.ActiveCfg = Debug|Any CPU
39+
{16DB9C04-0293-44A5-8682-AD4468C47298}.Debug|x86.Build.0 = Debug|Any CPU
40+
{16DB9C04-0293-44A5-8682-AD4468C47298}.Release|Any CPU.ActiveCfg = Release|Any CPU
41+
{16DB9C04-0293-44A5-8682-AD4468C47298}.Release|Any CPU.Build.0 = Release|Any CPU
42+
{16DB9C04-0293-44A5-8682-AD4468C47298}.Release|x64.ActiveCfg = Release|Any CPU
43+
{16DB9C04-0293-44A5-8682-AD4468C47298}.Release|x64.Build.0 = Release|Any CPU
44+
{16DB9C04-0293-44A5-8682-AD4468C47298}.Release|x86.ActiveCfg = Release|Any CPU
45+
{16DB9C04-0293-44A5-8682-AD4468C47298}.Release|x86.Build.0 = Release|Any CPU
46+
EndGlobalSection
47+
GlobalSection(SolutionProperties) = preSolution
48+
HideSolutionNode = FALSE
49+
EndGlobalSection
50+
GlobalSection(NestedProjects) = preSolution
51+
{8232D69B-C021-491A-A5E7-F3BE90F3EEB3} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
52+
{16DB9C04-0293-44A5-8682-AD4468C47298} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
53+
EndGlobalSection
54+
EndGlobal

Directory.Build.props

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<Project>
2+
<PropertyGroup>
3+
<LangVersion>preview</LangVersion>
4+
<Nullable>enable</Nullable>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
7+
<!-- Suppress known Windows SDK trim warnings -->
8+
<SuppressTrimAnalysisWarnings>true</SuppressTrimAnalysisWarnings>
9+
<TrimmerSingleWarn>false</TrimmerSingleWarn>
10+
</PropertyGroup>
11+
</Project>

Directory.Packages.props

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<Project>
2+
<PropertyGroup>
3+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
4+
</PropertyGroup>
5+
<ItemGroup>
6+
<PackageVersion Include="Microsoft.WindowsAppSDK" Version="1.8.251106002" />
7+
<PackageVersion Include="Microsoft.Web.WebView2" Version="1.0.3595.46" />
8+
<PackageVersion Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.7175" />
9+
<PackageVersion Include="CommunityToolkit.Mvvm" Version="8.4.0" />
10+
<PackageVersion Include="H.NotifyIcon.WinUI" Version="2.4.1" />
11+
</ItemGroup>
12+
</Project>

README.md

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
# 🛠️ Visual Studio Toolbox
2+
3+
<div align="center">
4+
5+
**Your Visual Studio installations, beautifully organized**
6+
7+
[![.NET](https://img.shields.io/badge/.NET-10.0-512BD4?style=for-the-badge&logo=dotnet)](https://dotnet.microsoft.com/)
8+
[![WinUI 3](https://img.shields.io/badge/WinUI-3.0-0078D4?style=for-the-badge&logo=windows)](https://microsoft.github.io/microsoft-ui-xaml/)
9+
[![Windows](https://img.shields.io/badge/Windows-11-00A4EF?style=for-the-badge&logo=windows11)](https://www.microsoft.com/windows)
10+
[![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)](LICENSE)
11+
12+
</div>
13+
14+
---
15+
16+
## 🎯 What is Visual Studio Toolbox?
17+
18+
Visual Studio Toolbox is a sleek **system tray application** for Windows that helps you manage all your Visual Studio installations in one place. Think of it as your personal command center for Visual Studio! 🚀
19+
20+
> 💡 **Inspired by JetBrains Toolbox** - bringing the same convenience to the Visual Studio ecosystem!
21+
22+
---
23+
24+
## ✨ Features
25+
26+
| Feature | Description |
27+
|---------|-------------|
28+
| 🔍 **Auto-Detection** | Automatically discovers all VS 2019, 2022, and 2026 installations |
29+
| 🎨 **Beautiful UI** | Modern WinUI 3 interface with light/dark mode support |
30+
| 🚀 **Quick Launch** | Launch any VS instance with a single click |
31+
| 🧪 **Experimental Hives** | See and launch experimental/custom VS hives |
32+
| 💻 **Developer Shells** | Launch VS Developer Command Prompt or PowerShell |
33+
| 📁 **Quick Access** | Open installation folders and AppData directories |
34+
| 🖥️ **Windows Terminal** | Integrates with your Windows Terminal profiles |
35+
| 📌 **System Tray** | Lives quietly in your system tray until needed |
36+
37+
---
38+
39+
## 📸 Screenshots
40+
41+
### Instance List
42+
See all your Visual Studio installations at a glance, including version info, build numbers, and preview badges:
43+
44+
![Instance List](instance-list.png)
45+
46+
### Quick Actions Menu
47+
Access powerful options for each installation - open folders, launch dev shells, and more:
48+
49+
![Instance Menu](instance-menu.png)
50+
51+
---
52+
53+
## 🚀 Getting Started
54+
55+
### Prerequisites
56+
57+
- 🪟 Windows 10/11
58+
- 📦 [.NET 10 SDK](https://dotnet.microsoft.com/download)
59+
- 🎨 [Windows App SDK 1.8+](https://learn.microsoft.com/en-us/windows/apps/windows-app-sdk/)
60+
61+
### Build & Run
62+
63+
```bash
64+
# Clone the repository
65+
git clone https://github.com/CalvinAllen/VSToolbox.git
66+
67+
# Navigate to the project
68+
cd VSToolbox
69+
70+
# Build and run
71+
dotnet run --project src/CodingWithCalvin.VSToolbox
72+
```
73+
74+
---
75+
76+
## 🎮 Usage
77+
78+
### 🖱️ Main Window
79+
- **Click** the ▶️ play button to launch Visual Studio
80+
- **Click** the ⚙️ gear button for more options:
81+
- 📂 Open Explorer - Open the VS installation folder
82+
- 💻 VS CMD Prompt - Launch Developer Command Prompt
83+
- 🐚 VS PowerShell - Launch Developer PowerShell
84+
- 📁 Open Local AppData - Access VS settings and extensions
85+
86+
### 📌 System Tray
87+
- **Click** the tray icon to show/hide the window
88+
- **Right-click** for quick menu (Show / Exit)
89+
- **X button** minimizes to tray instead of closing
90+
91+
---
92+
93+
## 🏗️ Architecture
94+
95+
```
96+
VSToolbox/
97+
├── 📁 src/
98+
│ ├── 📁 CodingWithCalvin.VSToolbox/ # 🎨 WinUI 3 Application
99+
│ │ ├── 📁 Views/ # XAML pages
100+
│ │ ├── 📁 ViewModels/ # MVVM view models
101+
│ │ └── 📁 Services/ # App services
102+
│ │
103+
│ └── 📁 CodingWithCalvin.VSToolbox.Core/ # 📦 Core Library
104+
│ ├── 📁 Models/ # Data models
105+
│ └── 📁 Services/ # VS detection & launch
106+
107+
└── 📁 tests/ # 🧪 Unit tests
108+
```
109+
110+
---
111+
112+
## 🛠️ Tech Stack
113+
114+
| Technology | Purpose |
115+
|------------|---------|
116+
| 💜 **C# 13** | Language |
117+
| 🎯 **.NET 10** | Runtime |
118+
| 🎨 **WinUI 3** | UI Framework |
119+
| 📦 **Windows App SDK 1.8** | Windows APIs |
120+
| 🔔 **H.NotifyIcon.WinUI** | System tray |
121+
| 🧰 **CommunityToolkit.Mvvm** | MVVM pattern |
122+
123+
---
124+
125+
## 🤝 Contributing
126+
127+
Contributions are welcome! Feel free to:
128+
129+
1. 🍴 Fork the repository
130+
2. 🌿 Create a feature branch (`git checkout -b feature/amazing-feature`)
131+
3. 💾 Commit your changes (`git commit -m 'Add amazing feature'`)
132+
4. 📤 Push to the branch (`git push origin feature/amazing-feature`)
133+
5. 🎉 Open a Pull Request
134+
135+
---
136+
137+
## 📄 License
138+
139+
This project is licensed under the **MIT License** - see the [LICENSE](LICENSE) file for details.
140+
141+
---
142+
143+
## 💖 Acknowledgments
144+
145+
- 🙏 Microsoft for Visual Studio and WinUI
146+
- 💡 JetBrains Toolbox for the inspiration
147+
- 🎨 The .NET community for amazing libraries
148+
149+
---
150+
151+
<div align="center">
152+
153+
**Made with 💜 by [Coding with Calvin](https://github.com/CodingWithCalvin)**
154+
155+
⭐ Star this repo if you find it useful! ⭐
156+
157+
</div>

instance-list.png

50.2 KB
Loading

instance-menu.png

62.6 KB
Loading
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net10.0-windows</TargetFramework>
5+
</PropertyGroup>
6+
7+
</Project>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
namespace CodingWithCalvin.VSToolbox.Core.Models;
2+
3+
public sealed class LaunchableInstance
4+
{
5+
public required VisualStudioInstance Instance { get; init; }
6+
public VisualStudioHive? Hive { get; init; }
7+
8+
public bool IsDefaultHive => Hive is null || Hive.IsDefault;
9+
public string? RootSuffix => Hive?.RootSuffix;
10+
11+
public string DisplayName => IsDefaultHive
12+
? Instance.ShortDisplayName
13+
: $"{Instance.ShortDisplayName} ({Hive!.DisplayName})";
14+
15+
public string BuildNumber => Instance.BuildNumber;
16+
public string InstallationPath => Instance.InstallationPath;
17+
public bool IsPrerelease => Instance.IsPrerelease;
18+
public string? IconPath => Instance.IconPath;
19+
public bool CanLaunch => Instance.CanLaunch;
20+
21+
public string ActionTooltip => CanLaunch ? "Launch" : "Open folder";
22+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace CodingWithCalvin.VSToolbox.Core.Models;
2+
3+
public enum VSSku
4+
{
5+
Unknown,
6+
Community,
7+
Professional,
8+
Enterprise,
9+
BuildTools
10+
}

0 commit comments

Comments
 (0)