푸터 콘텐츠로 바로가기
Iron Academy Logo
C# 배우기
C# 배우기

다른 카테고리

.NET 10에서 파일 기반 C# 실행

[[academy-video-youtube({"vid": "2i0MJDHvJq0", "start_time": "0", "title": "File-Based C# Execution in .NET 10", "creator": "Tim Corey", "length": "13m 36s"})]]

C#는 항상 코드를 실행하기 위해 프로젝트 파일을 요구해왔습니다. 가장 간단한 "Hello World"조차도 .csproj, Program.cs, 그리고 빌드 단계가 필요했습니다. .NET 10에서 이것이 바뀝니다. 이제 단일 .cs 파일을 작성하고 직접 실행할 수 있으며, 이는 Python 스크립트나 Node.js 파일을 실행하는 것과 같습니다.

비디오 ".NET 10에서 파일 기반 C# 실행"에서, Tim Corey는 이 기능의 모든 면을 살펴봅니다: 독립 실행형 파일 실행, 명령줄 인수 전달, NuGet 패키지 추가, 네이티브 실행 파일로 게시, 그리고 단일 파일 형식을 초과할 때 파일을 전체 프로젝트로 변환. 빠른 스크립트와 프로토타입에 콘솔 앱을 사용해왔다면 이 워크플로우가 크게 변합니다.

단일 C# 파일 실행

[0:40 - 1:48] Tim은 VS Code에서 빈 폴더로 시작합니다. 솔루션도, 프로젝트 파일도, 기본 파일이 없습니다. 그는 한 줄의 코드가 포함된 demo.cs이라는 단일 파일을 만듭니다:

Console.WriteLine("Hello World");
Console.WriteLine("Hello World");

그것을 실행하려면:

dotnet run file demo.cs
dotnet run file demo.cs

그게 전부입니다. dotnet run file 명령은 .cs 파일을 한 번에 컴파일하고 실행합니다. 중간 .csproj가 생성되지 않으며, binobj 폴더도 생성되지 않습니다. 정신 모델은 전통적인 C# 개발보다 스크립팅에 더 가깝습니다: 파일을 작성, 실행, 출력을 확인합니다.

Tim은 단일 파일 실행이 항상 기본값이었던 Python 및 JavaScript와 직접 비교합니다. .NET 10은 C#을 동일한 영역으로 끌어들입니다. C#의 매력을 유지하면서 말이죠: 타입 안전성과 성능.

명령 줄 인수 및 암시적 사용

[1:48 - 3:26] args 배열은 자동으로 제공되며, 이는 최상위 문을 사용하는 표준 Program.cs에서와 마찬가지입니다. Tim은 파일을 수정하여 이름 인수를 수락하도록 만듭니다:

Console.WriteLine($"Hello {args[0]}");
Console.WriteLine($"Hello {args[0]}");

인수로 실행하면:

dotnet run file demo.cs Tim
dotnet run file demo.cs Tim

"Hello Tim"을 출력합니다. Tim은 파일 기반 실행이 기본적으로 암시적 using을 포함하기 때문에 Console.WriteLineusing System; 문 없이도 작동한다고 지적합니다. 이는 C# 9에서 도입된 상위 레벨 문장과 동일한 동작입니다. 이제 독립 실행형 파일로 확장되었습니다.

Microsoft가 따르고 있는 더 넓은 패턴은 C#에서 하나의 릴리스마다의 형식을 줄이는 것입니다. 글로벌 using, 최상위 문, 그리고 이제 독립적인 .cs 파일은 모두 이전에 Python이나 배치 스크립트를 필요로 했던 빠른 작업에 C#을 사용할 수 있도록 하는 단계입니다.

사용자 입력 추가

[3:26 - 5:43] Tim은 대화형 입력으로 인수 접근을 대체하여 파일 기반 실행이 지원하는 콘솔 애플리케이션 패턴의 전체 범위를 보여줍니다:

Console.Write("What is your name? ");
string name = Console.ReadLine();
Console.WriteLine($"Hello {name}");
Console.Write("What is your name? ");
string name = Console.ReadLine();
Console.WriteLine($"Hello {name}");

이것을 실행하면 입력을 요청하고, 응답을 읽고, 인사를 출력합니다. 표준 I/O는 전체 프로젝트와 동일하게 작동합니다.

Tim이 지적하는 제한점: 이 모드는 엄격하게 단일 파일입니다. 두 개의 .cs 파일이 서로를 참조할 수 없습니다. 코드가 여러 파일이 필요할 정도로 커지면 프로젝트로 변환해야 합니다(비디오 후반부에서 다룹니다).

NuGet 패키지 가져오기

[5:43 - 7:49] 이곳이 스크립팅에 대해 진정으로 유용해지는 지점입니다. #r 지시어를 파일의 상단에 사용하여 .cs 파일 내에서 직접 NuGet 패키지를 참조할 수 있습니다:

#r "nuget:Spectre.Console, 0.54.0"
using Spectre.Console;

Console.Write("What is your name? ");
string name = Console.ReadLine();
AnsiConsole.MarkupLine($"Hello [red]{name}[/]");
#r "nuget:Spectre.Console, 0.54.0"
using Spectre.Console;

Console.Write("What is your name? ");
string name = Console.ReadLine();
AnsiConsole.MarkupLine($"Hello [red]{name}[/]");

#r "nuget:..." 문법은 런타임에 지정된 패키지를 다운로드하고 참조하도록 지시합니다. Tim은 Spectre.Console을 사용하여 출력의 색상을 변경하고 인사말 텍스트를 빨간색으로 만듭니다.

명령 dotnet add package 없음, 편집할 .csproj 없음, 복원 단계 없음. 패키지 참조는 소스 파일 자체에 있습니다. HTTP 클라이언트, JSON 직렬화기, 또는 포맷팅 라이브러리가 필요한 스크립트에는 하나의 종속성을 가져오기 위한 프로젝트 생성의 오버헤드를 제거합니다.

네이티브 실행 파일로 게시

[7:49 - 8:59] 파일 기반 스크립트를 독립형 바이너리로 배포하려면, publish 명령이 처리합니다:

dotnet publish file demo.cs
dotnet publish file demo.cs

이는 artifacts 폴더에 실행 파일을 생성합니다. 컴파일된 바이너리는 실행에 필요한 모든 것을 포함하며, 대상 머신에서 .NET SDK가 필요하지 않습니다. Tim은 파일 기반 빌드가 기본적으로 Native AOT를 사용, 이는 출력이 빠른 시작 시간을 가진 단일, 독립형 바이너리임을 의미한다고 언급합니다.

Native AOT가 특정 라이브러리와의 호환성 문제를 일으키면, 파일의 상단에 속성 지시어를 추가하여 비활성화할 수 있습니다. (패키지에 대한 #r의 작동 방식과 유사). 대부분의 스크립팅 사용 사례에 대해 AOT는 올바른 기본값입니다.

전체 프로젝트로 변환

[8:59 - 10:45] 단일 파일 형식을 초과할 때 스크립트를 위한 탈출구는 convert 명령입니다:

dotnet project convert file demo.cs
dotnet project convert file demo.cs

이는 #r 지시어에서 NuGet 패키지 참조를 포함한 .csproj 파일을 생성하고 코드를 표준 프로젝트 구조로 이동시킵니다. 그 이후로 여러 파일을 추가하고, 빌드 설정을 구성하고, 전체 .NET 프로젝트 시스템을 사용할 수 있습니다.

Tim은 이것을 자연스러운 진행으로 제시합니다: 빠른 실험을 위해 단일 파일로 시작하고, 범위가 확장되면 아무것도 다시 쓰지 않고 프로젝트로 이동합니다. #r 지시어는 생성된 .csproj에서 <PackageReference> 항목으로 깔끔하게 변환됩니다.

Native AOT 및 플랫폼 주의 사항

[10:45 - 12:42] 기본적으로 파일 기반 실행은 Native AOT로 컴파일되어 가능한 가장 빠른 시작 시간을 제공합니다. Tim은 CLI 도구와 콜드 스타트 성능이 중요한 스크립트에 이상적이라고 언급합니다. 라이브러리가 AOT 호환이 아닌 경우, 파일 수준 속성을 사용하여 해당 기능을 비활성화할 수 있습니다.

Linux와 macOS에서는 .cs 파일 상단에 해시뱅(#!/usr/bin/dotnet run file)을 추가하여 dotnet run file 접두사를 입력하지 않고 셸에서 직접 실행할 수 있습니다. 이로 인해 bash, Python, Ruby와 함께 C#이 완전히 스크립팅 영역에 들어옵니다.

마무리: 스크립팅 언어로서의 C

[12:42 - 13:05] Tim이 가장 교훈적으로 강조한 기능은 작은 작업에 대한 프로젝트 오버헤드의 제거입니다. 콘솔 앱은 항상 빠른 실험, 자동화 스크립트, 일회성 도구의 목적지였습니다. 파일 기반 실행은 이러한 것들이 필요 이상으로 무겁게 느껴지게 하는 의식을 제거하면서도 C#을 스크립팅 언어보다 선택할 가치가 있는 모든 장점(타입 안전성, 성능, NuGet 생태계)을 유지합니다.

결론

[13:05 - 13:36] 요약하자면, .NET 10의 파일 기반 실행은 dotnet run file와 함께 단일 .cs 파일을 실행하고 #r 지시어로 NuGet 패키지를 참조하며 dotnet publish file과 함께 네이티브 바이너리로 게시하고 단일 파일 형식이 초과되면 dotnet project convert file으로 전체 프로젝트로 변환할 수 있게 해줍니다. Native AOT가 기본적으로 켜져 있으며, Linux/macOS 사용자는 셸 수준 실행을 위한 해시뱅 지원을 받습니다.

현재 콘솔 앱을 프로토타입이나 자동화를 위해 사용하는 모든 것에 대해, 이것은 더 가벼운 대안으로 시도해 볼 가치가 있습니다.

예제 팁: NuGet 패키지를 테스트하거나 API 호출을 디버그하기 위해 콘솔 앱을 생성하는 경우, 대신 파일 기반 실행을 시도하세요. .cs 파일을 생성하고 상단에 #r "nuget:PackageName, Version"을 추가한 후 테스트 코드를 작성하고 dotnet run file으로 실행합니다. 완료되면 파일을 삭제하세요. 프로젝트 정리가 필요하지 않습니다.

전체 비디오를 그의 YouTube 채널에서 시청하고, 현대 C# 개발 워크플로우에 대한 더 많은 통찰력을 얻으세요.

Hero Worlddot related to .NET 10에서 파일 기반 C# 실행
Hero Affiliate related to .NET 10에서 파일 기반 C# 실행

사랑하는 것을 공유하여 더 많은 수익을 얻으세요

당신은 .NET, C#, Java, Python, 또는 Node.js를 다루는 개발자를 위한 콘텐츠를 만드나요? 당신의 전문성을 추가 수입으로 전환하세요!

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해