.NET 10.0 dotnet run app.cs 또는 파일 기반 프로그램 | NDepend Team


.NET 10 단일 C# 파일 실행 기능(.NET 10 dotnet run app.cs) 상세 요약

1. 개요

  • 단일 C# 소스 파일(app.cs)을 .csproj 없이 직접 실행하는 .NET 10 (프리뷰) 기능 소개.
  • 목적: 빠른 학습(초심자 친화), 프로토타이핑, 스크립트 작성, 다수의 샘플 파일 관리 간소화.
  • 실행 명령: dotnet run app.cs
  • 현재 상태: 2025년 8월 기준 프리뷰, .NET 10 정식은 2025년 11월 예정. 다중 파일 지원은 .NET 11로 이동.

2. 기본 실행 흐름 (dotnet run app.cs)

  1. 동일 폴더에 app.cs 작성 (Top-level statements, Main / Program 생략 가능).
  2. 명령 실행: dotnet run app.cs
  3. 첫 실행: 복원 및 컴파일에 약 13초 소요 후 출력: Hello, world.
  4. 임시 디렉터리 생성: C:\Users\pat\AppData\Local\Temp\dotnet\runfile\app-...\bin\debug 내부에 app.dll 생성.
  5. 재실행(파일 수정 후): 동일 임시 디렉터리 재사용 → 복원 생략(0.3초), 빌드 1.2초.
  6. 프리뷰 경고 메시지 출력.

3. 임시 디렉터리 및 캐시 메커니즘

  • 경로 패턴: %LOCALAPPDATA%/Temp/dotnet/runfile/<해시>/bin/debug.
  • 동일 파일명/위치 실행 시 재사용 → 속도 향상.
  • 외부 참조 DLL(NuGet / 프로젝트)의 복사본이 잔존할 수 있음(Newtonsoft.Json 예시).

4. 새 전처리 지시문(파일 상단 #: 형태)

4.1 #:sdk

  • 예: #:sdk Microsoft.NET.Sdk.Web
  • 효과: 단일 파일로 ASP.NET Minimal API 구동 가능.
#:sdk Microsoft.NET.Sdk.Web
using Microsoft.Extensions.Hosting;
var app = WebApplication.Create();
app.MapGet("/", () => "Hello, world!");
app.Run();

4.2 #:package

  • NuGet 패키지 참조 추가.
  • 예: #:package Newtonsoft.Json@13.0.3
  • 버전 와일드카드 지원: @*, @13.*, @13.0.* → 최신 해석.
#:package Newtonsoft.Json@13.0.3
using Newtonsoft.Json.Linq;
string json = @"{ ""name"": ""Alice"", ""age"": 30 }";
var obj = JObject.Parse(json);
string name = (string)obj["name"]; int age = (int)obj["age"];
Console.WriteLine($"{name} is {age} years old.");

4.3 #:property

  • 프로젝트 속성(TargetFramework, LangVersion 등) 지정.
  • C# 14 확장 everything 기능(예시 코드) 사용 위해 프리뷰에서 두 속성 모두 필요.
#:property TargetFramework=net10.0
#:property LangVersion=preview
var s = "this is a long string that needs to be truncated".AsSpan().Truncate(20);
Console.WriteLine(s.ToString());
static class ExtensionMethods {
	// C# 14 syntax
	extension<T>(ReadOnlySpan<T> span) {
		public ReadOnlySpan<T> Truncate(int maxLength) {
			return span.Length <= maxLength ? span : span.Slice(0, maxLength);
		}
	}
}
  • .csproj 등가:
<TargetFramework>net10.0</TargetFramework>
<LangVersion>preview</LangVersion>

4.4 #:project

  • 다른 .csproj 참조.
#:project .\MyClassLibrary\MyClassLibrary\MyClassLibrary.csproj
using MyClassLibrary;
Class1.Method();
  • 참조 DLL(MyClassLibrary.dll, .pdb)이 임시 경로에 복사.

4.5 Shebang (#!) (Unix 계열 한정)

#!/usr/bin/dotnet run   // (Unix-like only)
Console.WriteLine("Hello, world");
  • chmod +x app.cs./app.cs 직접 실행 가능.

5. 게시(dotnet publish app.cs)

  • 명령: dotnet publish app.cs.
  • 결과: 임시 경로 .../publish/release에 게시물 생성.

6. Directory.Build.props 활용 워크어라운드

  • 목적: 일부 지시문(#:property) 생략 가능.
  • 파일 예 (Directory.Build.props):
<Project>
  <PropertyGroup>
	 <TargetFramework>net10.0</TargetFramework>
	 <LangVersion>preview</LangVersion>
  </PropertyGroup>
</Project>
  • 해당 디렉터리(또는 상위) 배치 시 dotnet run app.cs 가 가상 프로젝트 구성(Microsoft.DotNet.Cli.Commands.Run.VirtualProjectBuildingCommand) 시 이를 반영.

7. 사용 시나리오 (When to use)

  • Beginner-friendly: 초심자 학습 곡선 완화 (Node.js, Python과 유사 단일 파일 경험).
  • Prototyping: 빠른 프로토타입 제작.
  • Scripts: 기존 Bash / PowerShell 작업을 C# 스크립트로 작성.
  • Samples: 다수 예제 파일을 한 폴더에 배치, 공통 속성은 Directory.Build.props로 공유.
  • 사용자 경험 인용(EntroperZero): 소규모 변환용 20라인 스크립트를 빠르게 작성/실행, 추가 프로젝트/불필요 산출물(bin 폴더) 회피, 저장소에 간단히 유지 가능, 다수 추가 스크립트 작성 용이.

8. 프로젝트 변환 (dotnet project convert app.cs)

  • 동작: 폴더 생성, .csproj 추가, 원본 파일에서 #: 지시문 제거 후 MSBuild 설정/참조로 이전.
  • 명령 예: dotnet project convert app.

9. 한계 및 향후 로드맵

  • 현재: 단일 파일 기반 프로그램 지원(프리뷰).
  • 계획: 다중 파일 기반 지원은 .NET 11에 예정 (단일 파일 경험 우선 개선 목적으로 연기).
  • 프리뷰 경고 메시지 및 기능(예: C# 14 관련) 사용 시 LangVersion=preview 필요.

10. 참고 자료 / 리소스 (원문 내 언급)

  • 지원 정책 URL: .NET 및 .NET Core 공식 지원 정책 | .NET
  • 관련 명령들: dotnet run app.cs, dotnet publish app.cs, dotnet project convert app.cs.
  • 전처리 지시문: #:sdk, #:package, #:property, #:project, Shebang(#!).
  • 가상 프로젝트 구성: Microsoft.DotNet.Cli.Commands.Run.VirtualProjectBuildingCommand
  • 기존 C# 스크립팅/경량 실행 도구: CS-Script, dotnet-script, Cake, LinqPad
  • 플랫폼 비교 언급: Node.js, Python (단일 파일 학습 경험 문맥)
  • 커뮤니티 의견 출처: Reddit (EntroperZero 코멘트)

11. 실용 팁 & 주의사항 (본문 기반)

  1. 프리뷰 경고: 프리뷰 기능 사용 중이므로 안정성 고려 필요.
  2. 재실행 속도: 동일 임시 디렉터리 재사용으로 첫 실행 후 빌드/복원 시간 대폭 감소 (Restore 0.3초, Build 1.2초 사례).
  3. 확장 문법(C# 14) 사용 시 반드시 TargetFramework=net10.0, LangVersion=preview 지정 또는 Directory.Build.props 활용.
  4. NuGet 버전 관리: 버전 와일드카드(*, 13.*, 13.0.*)는 최신 버전으로 자동 해석.
  5. Unix 전용 기능: Shebang 실행은 Unix-like 환경에서만 유효하며 실행 전 chmod +x 필요.
  6. 임시 디렉터리 관찰: 이전 실행 DLL(Newtonsoft.Json 등)이 잔존할 수 있어 구성 추적에 유용.
  7. 프로젝트 확장 필요 시: dotnet project convert app.cs로 손쉽게 정식 프로젝트 구조 전환.

12. 코드 스니펫 모음 (원문 발췌)

12.1 Minimal API

#:sdk Microsoft.NET.Sdk.Web
using Microsoft.Extensions.Hosting;
var app = WebApplication.Create();
app.MapGet("/", () => "Hello, world!");
app.Run();

12.2 Newtonsoft.Json 사용

#:package Newtonsoft.Json@13.0.3
using Newtonsoft.Json.Linq;
string json = @"{ ""name"": ""Alice"", ""age"": 30 }";
var obj = JObject.Parse(json);
string name = (string)obj["name"]; int age = (int)obj["age"];
Console.WriteLine($"{name} is {age} years old.");

12.3 C# 14 확장 everything 예시

#:property TargetFramework=net10.0
#:property LangVersion=preview
var s = "this is a long string that needs to be truncated".AsSpan().Truncate(20);
Console.WriteLine(s.ToString());
static class ExtensionMethods {
	extension<T>(ReadOnlySpan<T> span) {
		public ReadOnlySpan<T> Truncate(int maxLength) {
			return span.Length <= maxLength ? span : span.Slice(0, maxLength);
		}
	}
}

12.4 프로젝트 참조

#:project .\MyClassLibrary\MyClassLibrary\MyClassLibrary.csproj
using MyClassLibrary;
Class1.Method();

12.5 Shebang (Unix)

#!/usr/bin/dotnet run   // (Unix-like only)
Console.WriteLine("Hello, world");

13. 핵심 포인트 강조

  • 단일 파일 실행: dotnet run app.cs 로 즉시 실행.
  • 지시문 기반 구성: SDK/패키지/속성/프로젝트 참조를 코드 파일 안에서 선언.
  • 재사용 캐시: 임시 디렉터리 재활용으로 반복 빌드 속도 향상.
  • 프리뷰 요구: C# 14 문법은 LangVersion=preview 필요.
  • 확장 경로: 필요 시 dotnet project convert app.cs 로 손쉬운 프로젝트 전환.
  • 향후: 다중 파일 지원은 .NET 11 예정.
1개의 좋아요