성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Roll A Lisp In C - Reading ; https...
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>dotnet.exe - 윈도우 운영체제에서의 .NET Core 버전 찾기 규칙</h1> <p> .NET Core를 설치하면, 환경 변수 PATH에 dotnet.exe에 대한 경로가 추가됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [x64 .NET Core] C:\Program Files\dotnet\ [x86 .NET Core] C:\Program Files (x86)\dotnet\ </pre> <br /> <a name='corehost_trace'></a> Visual Studio 2017 명령행으로 "dotnet.exe"를 실행하면 다음과 같은 결과를 볼 수 있는데요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise><span style='color: blue; font-weight: bold'>dotnet</span> Microsoft .NET Core Shared Framework Host Version : 1.1.0 Build : 928f77c4bc3f49d892459992fb6e1d5542cb5e86 Usage: dotnet [common-options] [[options] path-to-application] Common Options: --help Display .NET Core Shared Framework Host help. --version Display .NET Core Shared Framework Host version. Options: --fx-version <version> Version of the installed Shared Framework to use to run the application. --additionalprobingpath <path> Path containing probing policy and assemblies to probe for. Path to Application: The path to a .NET Core managed application, dll or exe file to execute. <span style='color: blue; font-weight: bold'>If you are debugging the Shared Framework Host, set 'COREHOST_TRACE' to '1' in your environment.</span> To get started on developing applications for .NET Core, install the SDK from: http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409 </pre> <br /> 설명에 보면 "COREHOST_TRACE"라는 옵션이 보입니다. 실제로 이를 설정하고 dotnet.exe를 다시 실행해 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise><span style='color: blue; font-weight: bold'>SET COREHOST_TRACE=1</span> C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise><span style='color: blue; font-weight: bold'>dotnet</span> Tracing enabled --- Invoked dotnet [version: 1.1.0, commit hash: 928f77c4bc3f49d892459992fb6e1d5542cb5e86] main = { dotnet } Reading fx resolver directory=[C:\Program Files\dotnet\host\fxr] Considering fxr version=[.]... Considering fxr version=[..]... <span style='color: blue; font-weight: bold'>Considering fxr version=[1.0.5]... Considering fxr version=[1.1.2]... Detected latest fxr version=[C:\Program Files\dotnet\host\fxr\1.1.2]... Resolved fxr [C:\Program Files\dotnet\host\fxr\1.1.2\hostfxr.dll]...</span> Loaded library from C:\Program Files\dotnet\host\fxr\1.1.2\hostfxr.dll Tracing enabled --- Invoked hostfxr [commit hash: 928f77c4bc3f49d892459992fb6e1d5542cb5e86] main Own DLL path=[C:\Program Files\dotnet\dotnet.dll] Checking if CoreCLR path exists=[C:\Program Files\dotnet\coreclr.dll] --- Executing in muxer mode... Microsoft .NET Core Shared Framework Host Version : 1.1.0 Build : 928f77c4bc3f49d892459992fb6e1d5542cb5e86 ...[생략]... </pre> <br /> 시스템에 설치된 .NET Core의 버전 목록이 출력됩니다. 위의 경우에는 1.0.5, 1.1.2 버전의 .NET Core가 설치되어 있으며 각각의 버전에 따라 다음의 폴더에 hostfxr.dll 파일을 포함하고 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Program Files\dotnet\host\fxr\1.0.5 C:\Program Files\dotnet\host\fxr\1.1.2 </pre> <br /> 물론, 저 경로는 hostfxr.dll만 포함하고 있기 때문에 실질적인 버전 별 .NET Core 파일들은 각각의 버전에 따라 다음과 같이 별도로 분리되어 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Program Files\dotnet\shared\Microsoft.NETCore.App\1.0.5 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\1.1.2 </pre> <br /> 그러니까, "C:\Program Files\dotnet" 폴더에 있는 dotnet.exe는 일종의 shim 역할을 프로그램입니다. 이 때문에, 여러분들이 .NET Core 1.0으로 프로그램을 작성했든 1.1로 작성을 했든 상관없이 다음과 같은 명령어로 실행할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > "C:\Program Files\dotnet\dotnet.exe" test.dll </pre> <br /> dotnet.exe는 인자로 넘어온 test.dll 파일의 TargetFramework 특성을 보고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [assembly: TargetFramework(".NETCoreApp,Version=v1.1", FrameworkDisplayName="")] </pre> <br /> ".NETCoreApp,Version=v1.1"과 같이 지정된 버전에 맞는 .NET Core 런타임을 찾아서 로드해 주는 역할을 합니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> dotnet.exe의 버전 찾기 규칙을 알았으니 이제 dotnet.exe 실행 관련 오동작 사례를 하나 살펴보겠습니다.<br /> <br /> ASP.NET Core 1.1 프로젝트를 생성하고 (아무 작업도 하지 않았는데도) 실행했을 때, Output 윈도우에 다음과 같은 내용만 출력될 뿐 디버깅이나 실행이 전혀 안되는 경우가 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > The program '[9496] dotnet.exe' has exited with code <span style='color: blue; font-weight: bold'>-2147450749 (0x80008083)</span>. The program '[9496] dotnet.exe: Program Trace' has exited with code 0 (0x0). The program '[27308] iisexpress.exe: Program Trace' has exited with code 0 (0x0). The program '[27308] iisexpress.exe' has exited with code 0 (0x0). </pre> <br /> Visual Studio에서 dotnet.exe를 어떻게 실행하는지 알아보기 위해 sysmon을 구동시켜 dotnet.exe 실행 환경을 알아낼 수 있고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > "C:\Program Files (x86)\dotnet\dotnet.exe" exec "C:\temp\WebApplication1\WebApplication1\bin\Debug\netcoreapp1.1\WebApplication1.dll" </pre> <br /> 실제로 명령행을 띄워 위의 결과 그대로 실행해 보면, 다음과 같은 출력과 함께 ERRORLEVEL도 -2147450749 값으로 Visual Studio의 출력과 동일합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\temp\WebApplication1><span style='color: blue; font-weight: bold'>"C:\Program Files (x86)\dotnet\dotnet.exe" exec "C:\temp\WebApplication1\WebApplication1\bin\Debug\netcoreapp1.1\WebApplication1.dll"</span> The specified framework 'Microsoft.NETCore.App', version '1.1.2' was not found. - Check application dependencies and target a framework version installed at: C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App <span style='color: blue; font-weight: bold'>- The following versions are installed: 1.0.4 1.1.1 - Alternatively, install the framework version '1.1.2'.</span> C:\temp\WebApplication1><span style='color: blue; font-weight: bold'>echo %ERRORLEVEL%</span> <span style='color: blue; font-weight: bold'>-2147450749</span> </pre> <br /> 위의 출력 결과를 보면, 1.0.4, 1.1.1 버전은 찾았으나 제가 생성한 ASP.NET Core 1.1에서 지정한 "1.1.2" 버전의 .NET Core는 찾을 수 없다는 것입니다. 따라서 지정된 버전의 런타임을 추가적으로 설치해 주면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > .NET Core Runtime and SDK download archive ; <a target='tab' href='https://github.com/dotnet/core/blob/master/release-notes/download-archive.md'>https://github.com/dotnet/core/blob/master/release-notes/download-archive.md</a> </pre> <br /> 원하는 1.1.2 버전이 dotnet.exe에 의해 검색이 되고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise><span style='color: blue; font-weight: bold'>SET COREHOST_TRACE=1</span> C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise><span style='color: blue; font-weight: bold'>dotnet</span> Tracing enabled --- Invoked dotnet [version: 1.1.0, commit hash: 928f77c4bc3f49d892459992fb6e1d5542cb5e86] main = { dotnet } Reading fx resolver directory=[C:\Program Files (x86)\dotnet\host\fxr] Considering fxr version=[.]... Considering fxr version=[..]... Considering fxr version=[1.0.5]... Considering fxr version=[1.1.0]... <span style='color: blue; font-weight: bold'>Considering fxr version=[1.1.2]...</span> Detected latest fxr version=[C:\Program Files (x86)\dotnet\host\fxr\1.1.2]... Resolved fxr [C:\Program Files (x86)\dotnet\host\fxr\1.1.2\hostfxr.dll]... Loaded library from C:\Program Files (x86)\dotnet\host\fxr\1.1.2\hostfxr.dll Tracing enabled --- Invoked hostfxr [commit hash: 928f77c4bc3f49d892459992fb6e1d5542cb5e86] main Own DLL path=[C:\Program Files (x86)\dotnet\dotnet.dll] Checking if CoreCLR path exists=[C:\Program Files (x86)\dotnet\coreclr.dll] --- Executing in muxer mode... </pre> <br /> 이제부터 실행도 잘 됩니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1171
(왼쪽의 숫자를 입력해야 합니다.)