
NetWasm 0.8.0은 42를 출력하는 같은 작업에서 런타임과 정밀 가비지 컬렉터를 포함한 WebAssembly 파일을 47,798바이트로 만들었다. 같은 출력 형식과 크기 최적화 설정을 적용한 Rust 1.95.0의 53,635바이트보다 원본 파일은 10.9%, Brotli-11 압축 후에는 20.4% 작다. 이는 특정 작업과 설정에서 얻은 결과이지, 언어 전반의 크기 순위를 뜻하지 않는다.
NetWasm은 C#과 .NET CIL을 WebAssembly로 직접 컴파일하는 독립 컴파일러·런타임·SDK다. 데스크톱 CLR이나 Mono, dotnet.js, 애플리케이션 DLL을 배포물에 포함하지 않는다고 프로젝트 측은 설명한다. 비교 대상은 모두 독립형 WASI Preview 2 컴포넌트다.
| 도구·버전 | 원본 Wasm | Brotli 11 | 비교 조건 |
|---|---|---|---|
| NetWasm 0.8.0, Compact GC | 47,798 B | 13,501 B | 정밀 GC 포함 WASI P2 컴포넌트 |
| Rust 1.95.0, 크기 최적화 프로필 | 53,635 B | 16,963 B | 같은 조건의 WASI P2 컴포넌트 |
Kotlin 2.4.0 wasmWasi | 79,293 B | 22,655 B | P1 환경, GC는 호스트 엔진이 제공 |
| TinyGo 0.39.0 | 93,043 B | 26,931 B | P1 환경, 정밀 GC 설정 |
NetWasm은 도달 가능한 코드만 컴파일하고 필요한 런타임 기능만 연결한다. 런타임 리플렉션이나 동적 어셈블리 로딩 등 데스크톱 .NET의 기능을 모두 지원하는 대신, 지원 프로필을 더 작게 유지한다. JSON, 의존성 주입, WIT와 네이티브 연동은 런타임 탐색이 아닌 사전에 정해진 계약을 사용한다.
프로젝트가 제시한 기능에는 일반 dotnet CLI를 통한 빌드·실행·게시·테스트, 브라우저 C# Web Workers, WIT 바인딩 생성, 호환되는 Wasm .a 아카이브 연결, LINQ·HTTP·JSON·XML·Regex 라이브러리 등이 있다. 라이브러리는 netwasm0.1과 데스크톱 .NET을 함께 대상으로 지정할 수 있지만, 임의의 데스크톱 패키지가 그대로 호환된다는 뜻은 아니다.
설치와 사용 조건
.NET SDK 10.0.303 이상을 설치한 뒤 템플릿을 설치하고 프로젝트를 만들 수 있다.
dotnet new install NetWasm.Templates
dotnet new netwasm-app -n HelloNetWasm
cd HelloNetWasm
dotnet restore
dotnet run
dotnet publish -c Release -o publish/local
게시한 컴포넌트는 Wasmtime 같은 호환 WASI Preview 2 호스트에서 실행한다.
wasmtime run publish/local/HelloNetWasm.wasm
프로젝트 측 설명에 따르면 게시물은 .NET에 대해서는 자체 포함되지만 WebAssembly 호스트는 여전히 필요하다. SDK는 고정 버전의 Node, LLD, Binaryen 도구를 NuGet으로 복원하므로 일반 앱에 별도의 Emscripten, Git, Python 설치가 필요하지 않다. C# 15 프로젝트는 .NET 11 SDK를 선택하며, 이전 언어 버전은 .NET 10을 사용할 수 있다. 설치·빌드 안내
Compact는 기본 가비지 컬렉터로, 크기를 우선하는 정밀 비이동 마크앤스위프 방식이다. 다른 수집 전략과 크기는 다음과 같다.
| 전략 | 적합한 용도 | 원본 컴포넌트 | Brotli 11 |
|---|---|---|---|
| Compact (기본값) | 작은 앱과 할당량이 적은 UI | 47,798 B | 13,501 B |
| NetWasmGC | 더 높은 할당 처리량 | 51,300 B | 15,157 B |
| Bump | 작업 범위가 한정된 일회성 작업 | 43,794 B | 11,929 B |
| Boehm | 보수적 수집기 호환성 | 74,142 B | 25,023 B |
실행 프로젝트의 .csproj에서 수집 전략을 선택할 수 있다.
<PropertyGroup>
<NetWasmGarbageCollector>NetWasm</NetWasmGarbageCollector>
</PropertyGroup>
지원 범위와 한계
NetWasm은 아직 1.0 이전 버전이다. 지원 프로필은 사용할 수 있고 공개된 자격 검증을 거쳤지만, 소스·패키지·대상 프로필·ABI 계약은 마이너 버전 사이에 바뀔 수 있다. 기본 출력은 wasm32 WASI Preview 2 컴포넌트다. wasm64 컴포넌트는 상위 도구 문제로 아직 사용할 수 없으며, 원시 wasm32·wasm64와 JavaScript 호스트 연동은 고급 대안으로 소개된다.
런타임 리플렉션, dynamic, 런타임 어셈블리 로딩, 관리형 스레드는 지원 프로필 밖이다. 일반 System.IO.File·Directory·FileStream, 원시 소켓, 하위 프로세스 API도 아직 구현되지 않았다. NuGet 패키지는 실제로 사용되는 코드와 API 의존성이 지원 프로필에 들어맞을 때만 작동한다. 지원 API와 제한 사항
NetWasm은 .NET 10·11 Blazor WebAssembly와도 크기를 비교했다. 42를 출력하는 빈 UI Blazor 애플리케이션에 AOT, 관리 코드 트리밍, IL 스트리핑, 불변 문화권 설정, 크기 중심 네이티브 링크를 적용한 결과다.
| 빌드 | 압축하지 않은 Wasm | NetWasm 대비 |
|---|---|---|
| NetWasm 0.8.0, Compact GC | 47,798 B | 1× |
| Blazor WebAssembly, .NET 10 | 12,276,684 B | 257× |
| Blazor WebAssembly, .NET 11 RC1 | 15,289,241 B | 320× |
Blazor의 합계에는 네이티브 런타임과 필요한 Webcil 어셈블리가 포함되고, NetWasm에는 런타임·가비지 컬렉터·WASI 컴포넌트가 포함된다. 비교는 콘솔 컴포넌트와 빈 UI 애플리케이션 사이의 차이를 보여주며, 동등한 프레임워크 비교나 모든 .NET 작업에 대한 주장은 아니다. 측정 설정과 재현 방법
NetWasm 0.9.0에서는 도달 가능한 코드가 지원 프로필에 맞는 경우 .NET Standard 2.1 라이브러리 바이너리와 NuGet 자산의 호환성을 넓히는 것이 목표다. 이는 데스크톱 .NET 전체를 지원한다는 뜻은 아니다. 해당 호환성 범위에서도 일반 리플렉션, dynamic, 런타임 어셈블리 로딩, 관리형 스레드, 미지원 호스트 API, 명명된 문화권 국제화는 제외되며 컴파일 시 오류가 난다. 1.0 로드맵
NetWasm의 컴파일러와 개발 도구에는 NetWasm Community License 1.0이 적용된다. 자격을 갖춘 개인, 교육, 오픈소스 작업, 평가 목적 및 직원 250명 미만이면서 연 매출 1,000만 달러 미만인 조직은 무료로 사용할 수 있다. GitHub Sponsors의 해당 후원 등급에는 제한된 내부 상업적 사용 권한이 제공되며, OEM 및 상용 제품 사용에는 별도 계약이 필요하다. 라이선스 안내
NetWasm 저장소 · 브라우저에서 체험 · 문서
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요