Microsoft MVP성태의 닷넷 이야기
.NET Framework: 599. .NET Core/SDK 설치 및 기본 사용법 [링크 복사], [링크+제목 복사]
조회: 24230
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

.NET Core/SDK 설치 및 기본 사용법

아래의 글을 잠깐 읽고 내용을 좀 보태서 써봤습니다.

Exploring dotnet new with .NET Core
; http://www.hanselman.com/blog/ExploringDotnetNewWithNETCore.aspx

우선, .NET Core의 CLI 부분이 오픈 소스인 것은 아실테고.

dotnet/cli 
; https://github.com/dotnet/cli

.NET Framework Full 버전을 비롯해서 .NET Core의 각종 포팅 버전들을 다음의 경로에서 다운로드 할 수 있습니다.

.NET Downloads
; https://dotnet.microsoft.com/download

개발자라면 SDK 버전을 다운로드 받으시고,

.NET Core SDK Installer - x64
; https://dotnet.microsoft.com/download

그 응용 프로그램을 배포할 대상 컴퓨터에는 그냥 런타임만 설치하시면 됩니다.

.NET Core Installer - x64
; https://dotnet.microsoft.com/download

자바랑 비교하자면, JDK == ".NET Core SDK"이고 JRE == ".NET Core"라고 보시면 됩니다.

설치를 하고 나면, %PROGRAMFILES% 하위에 "dotnet"이라는 폴더가 생성되고 다음과 같은 구조로 설치가 됩니다.

C:\Program Files\dotnet
                       \host  
                            \fxr
                                \1.0.1\hostfxr.dll
                       \shared
                            \Microsoft.NETCore.App
                                \1.0.0\(.NET CLR 호스팅 DLL, BCL 어셈블리 및 Windows DLL...)
                       \swidtag

                       \sdk (SDK 버전에서만!)
                           \1.0.0-preview1-002702
                           \1.0.0-preview2-003121\(.NET 어셈블리들 - NuGet, System.,,,)

".NET Core SDK" 설치와 ".NET Core" 설치의 차이점은 "\sdk" 폴더 밖에 없습니다.

그 외에, 두 설치 파일 모두 System 환경 변수에 "C:\Program Files\dotnet\" 폴더를 PATH에 추가시키는 정도만 있을 뿐 기타 시스템 변경 사항은 없습니다.




자, 그럼 환경 변수도 설정되어 있으니 명령행 창을 띄우고 dotnet.exe를 실행해 볼까요? 우선 "new" 옵션부터 보겠습니다.

C:\temp\dot_test>dotnet new

Welcome to .NET Core!
---------------------
Learn more about .NET Core @ https://aka.ms/dotnet-docs. Use dotnet --help to see available commands or go to https://aka.ms/dotnet-cli-docs.
Telemetry
--------------
The .NET Core tools collect usage data in order to improve your experience. The data is anonymous and does not include commandline arguments. The data is collected by Microsoft and shared with the community.
You can opt out of telemetry by setting a DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 using your favorite shell.
You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-telemetry.
Configuring...
-------------------
A command is running to initially populate your local package cache, to improve restore speed and enable offline access. This command will take up to a minute to complete and will only happen once.
Decompressing 100% 2168 ms
Expanding 100% 7518 ms
Created new C# project in C:\temp\dot_test.

최초 한번 new 옵션으로 실행하면 저렇게 "telemetry" 옵션을 켜는 것으로 시작합니다. 뭔가 싶었는데, "Windows Experience Improvement Program"과 유사한 것입니다. 익명으로 수집된다는 데 원치 않는다면 DOTNET_CLI_TELEMETRY_OPTOUT 환경 변수를 1로 설정하시면 됩니다. (최초 한번 실행 때만 이렇게 알려줍니다.)

중요한 것은 c:\temp\dot_test 폴더에 C# 프로젝트를 생성했다는 것입니다. 뭐 대단한 것은 아니고 다음의 2개 파일 정도만 생성될 뿐입니다.

  • Program.cs
  • project.json

Program.cs는 간단한 소스 파일이고

using System;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

project.json은 일반적인 .csproj처럼 C# 프로젝트 파일이라고 보시면 됩니다. 대충 다음과 같은 내용을 담습니다.

{
  "version": "1.0.0-*",
  "buildOptions": {
    "debugType": "portable",
    "emitEntryPoint": true
  },
  "dependencies": {},
  "frameworks": {
    "netcoreapp1.0": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.0.0"
        }
      },
      "imports": "dnxcore50"
    }
  }
}

빌드는 "build" 옵션으로 가능하지만,

C:\temp\dot_test>dotnet build
Project dot_test does not have a lock file. Please run "dotnet restore" to generate a new lock file.
Project dot_test does not have a lock file. Please run "dotnet restore" to generate a new lock file.

오류 메시지에서 보는 것처럼, "dotnet new" 후에 최초 한번은 저렇게 "dotnet restore"를 해줘야 합니다.

C:\temp\dot_test>dotnet restore
log  : Restoring packages for C:\temp\dot_test\project.json...
log  : Writing lock file to disk. Path: C:\temp\dot_test\project.lock.json
log  : C:\temp\dot_test\project.json
log  : Restore completed in 929ms.

C:\temp\dot_test>dotnet build
Project dot_test (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing
Compiling dot_test for .NETCoreApp,Version=v1.0

Compilation succeeded.
    0 Warning(s)
    0 Error(s)

Time elapsed 00:00:01.0198682

"dotnet restore" 실행 출력문을 보면, restore 명령은 proejct.lock.json을 만들어 주는 거 이외에도 project.json에 포함된 종속 관계의 패키지들을 설치해주는 역할을 합니다. 따라서, 종속성이 있어도 project.json에 잘 명시만 되어 있으면 "restore" 명령으로 인해 다른 개발자 PC에서도 쉽게 종속 패키지들이 자동으로 준비가 됩니다.

.NET Core SDK가 설치된 경우 "dotnet run" 명령도 가능한데, 이것은 빌드가 되어 있지 않으면 빌드까지 자동으로 한 후 실행을 합니다.

C:\temp\dot_test>dotnet run
Project dot_test (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing
Compiling dot_test for .NETCoreApp,Version=v1.0

Compilation succeeded.
    0 Warning(s)
    0 Error(s)

Time elapsed 00:00:00.8147279


Hello World!

그런데 "run" 옵션은 ".NET Core" 버전에서는 실행되지 않습니다. 만약 실행하면 다음과 같은 식의 오류 메시지를 볼 수 있습니다.

C:\temp\dot_test>dotnet run
Did you mean to run dotnet SDK commands? Please install dotnet SDK from:
  http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409

그럼 ".NET Core" 버전에서는 실행을 어떻게 하냐고요? 그냥 "run" 없이 닷넷 어셈블리 파일을 지정해 주면 됩니다.

C:\temp\dot_test>dotnet c:\temp\dot_test\bin\release\netcoreapp1.0\dot_test.dll
Hello World!

그런데... 뭔가 이상하군요. 콘솔 응용 프로그램인데 왜 산출물이 dot_test.dll일까요? 그것은 .NET Core 응용 프로그램은 무조건 dotnet.exe가 진입점이기 때문에 실행 파일조차도 .dll로 된 것입니다. 마치 Java에서도 .exe가 아닌 .class나 .jar를 지정하는 것과 유사합니다.




그 외, 기타 자잘한 명령어로 다음의 것들이 있습니다.

  • dotnet new -t lib
  • dotnet new -t web
  • dotnet new -t xunittest

이름에서 유추할 수 있듯이, 첫번째는 "라이브러리 유형의 프로젝트"를 자동 생성해 주고, 두번째는 "ASP.NET Core 프로젝트", 세번째는 "XUnit 단위 테스트 프로젝트"를 생성합니다.

덤으로, 로드맵 링크 하나! ^^

MS, 닷넷코어 새 로드맵 공개
; http://www.zdnet.co.kr/news/news_view.asp?artice_id=20160718091844




참고로, "Visual Studio Code"의 환경 구성을 볼까요? 설치 후 C# 파일을 열면 다음과 같이 확장 도구를 권장하는 문구가 뜹니다.

net_core_first_1.png

여기서 "Show Recommendations"를 누르면 다음과 같이 "EXTENSION" 탭이 열리면서 어떤 확장 도구를 설치할지 묻습니다. 저는 그냥 "Microsoft"에서 제공하는 "C# 1.2.2" 확장을 선택했습니다.

net_core_first_2.png

그런 다음 Program.cs 파일이 담긴 폴더를 Visual Studio Code에서 "File" / "Open Folder..." 메뉴를 선택해 열면 됩니다. 인텔리센스도 지원되고 디버깅도 확장 도구 설치를 통해 이용할 수 있습니다. 물론, Visual Studio 버전과는 비교가 안되지만. ^^




마지막으로 ".NET Core" 버전이 지원하는 윈도우 운영체제 버전은 윈도우 7 이상입니다.

재미있는 것은, XP/2003 에서는 ".NET Core Installer" 런타임이 설치는 되지만 실행시 "C:\Program Files\dotnet\dotnet.exe is not a valid Win32 application" 오류 메시지 창과 함께 "Access is denied" 오류가 발생합니다.

C:\temp>dotnet
Access is denied.

Vista 역시 설치도 되고 dotnet.exe 단독 실행까지 되지만, 정작 닷넷 어셈블리를 실행하려면 필요한 Win32 API가 없다는 다음의 오류 메시지가 나옵니다.

The procedure entry point ResolveLocaleName could not be located in the dynamic link library KERNEL32.dll

이와 함께 명령행에는 0x8007007F 오류 코드가 나옵니다.

C:\temp>dotnet dot_test.dll
Failed to load the dll from [C:\Program Files\dotnet\shared\Microsoft.NETCore.App\1.0.0\coreclr.dll], HRESULT: 0x8007007F
Failed to bind to CoreCLR at 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\1.0.0\coreclr.dll'




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 5/21/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2016-08-18 12시20분
정성태
2016-12-13 08시11분
[정환나라] dotnet core로 작성한 dll을 기존 .net Framework로 작성된 프로젝트에 참조하여 사용이 가능하던데 ILSpy 등으로 읽어오는데는 문제가 있더군요.
즉, 어느정도의 암호화가 적용되어 있다고 봐야 할까요?

그렇다면 암호화가 필요한 코드라던지 그런 부분은 .net core로 작성해서 참조하여 사용하는 방식도 괜찮지 않을까요?
[guest]
2016-12-14 02시13분
@정환나라 문제가 있다는 것이 어떤 정도인지는 모르겠지만 암호화가 적용되었을 것 같지는 않습니다. 혹시 .NET Reflector로도 해보셨나요? 사실 PE(Portable Executable) 파일 분석 같은 툴들도 개발자에 따라서 약간의 헤더 분석만 잘못해도 비정상 종료하는 것처럼, ILSpy 측의 DLL 분석에 약간의 오류가 있을 수도 있습니다.

암호화가 아마 안되었을 거라는 것은, 어차피 클라이언트에서 실행해야 하므로 복호화키도 담겨져 있어야 합니다. 그렇다면 어차피 분석되는 것은 마찬가지이기 때문에 딱히 실행 시 오버헤드를 감수하고 그런 것을 했을 것 같지는 않습니다.
정성태
2016-12-14 07시37분
[정환나라] 그렇긴 하겠네요. 답변 감사합닌다
[guest]
2017-04-05 12시15분
정성태
2017-04-05 12시44분
Deploying a self contained .Net core application on Linux and run as a daemon process
; http://cloudauthority.blogspot.kr/2017/01/deploying-self-contained-net-core.html
정성태

... 46  47  48  [49]  50  51  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12400정성태11/5/20207465오류 유형: 679. Visual Studio - "Source Not Found" 창에 "Decompile source code" 링크가 없는 경우
12399정성태11/5/202011074.NET Framework: 961. C# 9.0 - (10) 대상으로 형식화된 조건식(Target-typed conditional expressions)파일 다운로드1
12398정성태11/4/20209501오류 유형: 678. Windows Server 2008 R2 환경에서 Powershell을 psexec로 원격 실행할 때 hang이 발생하는 문제
12397정성태11/4/20209625.NET Framework: 960. C# - 조건 연산자(?:)를 사용하는 경우 달라지는 메서드 선택 사례파일 다운로드1
12396정성태11/3/20208052VS.NET IDE: 152. Visual Studio - "Tools" / "External Tools..."에 등록된 외부 명령어에 대한 단축키 설정 방법
12395정성태11/3/20209319오류 유형: 677. SSMS로 DB 접근 시 The server principal "..." is not able to access the database "..." under the current security context.
12394정성태11/3/20207762오류 유형: 676. cacls - The Recycle Bin on ... is corrupted. Do you want to empty the Recycle Bin for this drive?
12393정성태11/3/20208249오류 유형: 675. Visual Studio - 닷넷 응용 프로그램 디버깅 시 Disassembly 창에서 BP 설정할 때 "Error while processing breakpoint." 오류
12392정성태11/2/202012383.NET Framework: 959. C# 9.0 - (9) 레코드(Records) [4]파일 다운로드1
12390정성태11/1/202010512디버깅 기술: 173. windbg - System.Configuration.ConfigurationErrorsException 예외 분석 방법
12389정성태11/1/202010452.NET Framework: 958. C# 9.0 - (8) 정적 익명 함수 (static anonymous functions)파일 다운로드1
12388정성태10/29/20209819오류 유형: 674. 어느 순간부터 닷넷 응용 프로그램 실행 시 System.Configuration.ConfigurationErrorsException 예외가 발생한다면?
12387정성태10/28/202010543.NET Framework: 957. C# - static 필드의 정보가 GC Heap에 저장될까요? [3]파일 다운로드1
12386정성태10/28/202010822Linux: 34. 사용자 정보를 함께 출력하는 리눅스의 ps 명령어 사용 방법
12385정성태10/28/20208565오류 유형: 673. openssl - req: No value provided for Subject Attribute CN, skipped
12384정성태10/27/20209795오류 유형: 672. AllowPartiallyTrustedCallers 특성이 적용된 어셈블리의 struct 멤버 메서드를 재정의하면 System.Security.VerificationException 예외 발생
12383정성태10/27/202010794.NET Framework: 956. C# 9.0 - (7) 패턴 일치 개선 사항(Pattern matching enhancements) [3]파일 다운로드1
12382정성태10/26/20208408오류 유형: 671. dotnet build - The local source '...' doesn't exist
12381정성태10/26/202010056VC++: 137. C++ stl map의 사용자 정의 타입을 key로 사용하는 방법 [1]파일 다운로드1
12380정성태10/26/20207564오류 유형: 670. Visual Studio - Squash_FailureCommitsReset
12379정성태10/21/202010477.NET Framework: 955. .NET 메서드의 Signature 바이트 코드 분석 [1]파일 다운로드2
12378정성태10/15/20209947.NET Framework: 954. C# - x86/x64 환경에 따라 달라지는 P/Invoke 함수의 export 이름파일 다운로드1
12377정성태10/15/202011290디버깅 기술: 172. windbg - 파일 열기 시점에 bp를 걸어 파일명 알아내는 방법(Managed/Unmanaged)
12376정성태10/15/20208044오류 유형: 669. windbg - sos의 name2ee 명령어 실행 시 "Failed to request module list." 오류
12375정성태10/15/20209402Windows: 177. 윈도우 탐색기에서 띄우는 cmd.exe 창의 디렉터리 구분 문자가 'Yen(¥)' 기호로 나오는 경우 [1]
12374정성태10/14/202013962.NET Framework: 953. C# 9.0 - (6) 함수 포인터(Function pointers) [1]파일 다운로드2
... 46  47  48  [49]  50  51  52  53  54  55  56  57  58  59  60  ...