Tauri
Tauri è un framework per applicazioni desktop che usa il webview nativo del sistema operativo (WebKit su macOS/Linux, WebView2 su Windows) invece di includere Chromium. Il risultato è un bundle molto più leggero rispetto a Electron (~5–15 MB).
Il backend nativo di Tauri è in Rust. ASP.NET Core non può girare in-process: viene avviato come processo sidecar, ovvero un eseguibile esterno gestito da Tauri che viene avviato e terminato insieme all'app.
Quando ha senso
Tauri è giustificato quando il bundle size è un requisito stringente (distribuzione su banda limitata, ambienti con storage ridotto) e si è disposti a gestire la complessità aggiuntiva del sidecar.
Struttura del progetto
my-app/
├── src-tauri/ ← progetto Rust + configurazione Tauri
│ ├── src/main.rs
│ ├── Cargo.toml
│ └── tauri.conf.json
├── frontend/ ← progetto Angular
└── backend/ ← progetto ASP.NET Core (compilato come sidecar)
Configurare il sidecar
Il backend ASP.NET Core viene dichiarato come sidecar in tauri.conf.json. Tauri lo avvia automaticamente all'apertura dell'app e lo termina alla chiusura.
// src-tauri/tauri.conf.json
{
"bundle": {
"externalBin": ["binaries/MyApi"]
},
"app": {
"security": {
"capabilities": []
}
}
}
Il binario del backend va compilato come self-contained e copiato in src-tauri/binaries/ con il suffisso del target corrente (es. MyApi-x86_64-pc-windows-msvc.exe). Tauri cerca il binario con quel pattern.
# Pubblicare il backend come self-contained
dotnet publish backend/ -c Release -r win-x64 --self-contained -o src-tauri/binaries/
# Rinominare: MyApi.exe → MyApi-x86_64-pc-windows-msvc.exe
Avviare il sidecar da Rust
// src-tauri/src/main.rs
use tauri::Manager;
use tauri_plugin_shell::ShellExt;
fn main() {
tauri::Builder::default()
.plugin(tauri_plugin_shell::init())
.setup(|app| {
let handle = app.handle().clone();
tauri::async_runtime::spawn(async move {
handle
.shell()
.sidecar("MyApi")
.expect("sidecar non trovato")
.spawn()
.expect("impossibile avviare il backend");
});
Ok(())
})
.run(tauri::generate_context!())
.expect("errore avvio Tauri");
}
Frontend Angular
Angular comunica con il backend C# tramite HTTP normale su localhost. La configurazione è identica all'approccio Electron puro: un interceptor che aggiunge l'URL base.
// environment.ts
export const environment = {
apiBaseUrl: 'http://localhost:5000'
};
Per richiamare funzionalità native (dialogo file, notifiche) si può usare il plugin Tauri via @tauri-apps/api:
npm install @tauri-apps/api
import { open } from '@tauri-apps/plugin-dialog';
const filePath = await open({
multiple: false,
filters: [{ name: 'PDF', extensions: ['pdf'] }]
});
Build
npm run tauri build
L'output contiene l'installer per la piattaforma corrente. Per build cross-platform si usa GitHub Actions con runner distinti per Windows, macOS e Linux.
Limitazioni
- ASP.NET Core non è in-process: la sincronizzazione avvio sidecar / apertura webview va gestita (polling su
/healtho attesa su stdout del sidecar) - Il binding nativo Rust ↔ Angular è più verboso rispetto a Electron (IPC via comandi Tauri)
- Il webview nativo può avere comportamenti diversi tra piattaforme (WebKit su macOS/Linux vs WebView2 su Windows): testare su tutte le piattaforme target
- Richiede una toolchain Rust installata in sviluppo