성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 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...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
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'>C# 6.0 오픈 소스 컴파일러 Roslyn - 빌드 및 테스트 방법</h1> <p> 물론, Roslyn을 빌드하고 테스트하는 방법은 아래의 링크에 자세하게 나옵니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > dotnet/roslyn Building, Testing, and Debugging ; <a target='tab' href='https://github.com/dotnet/roslyn/wiki/Building%20Testing%20and%20Debugging'>https://github.com/dotnet/roslyn/wiki/Building%20Testing%20and%20Debugging</a> </pre> <br /> 저 글을 보셔도 되고... 이 글을 보셔도 되고. ^^<br /> <br /> 자... 그럼 한번 해볼까요? ^^<br /> <br /> 맨 먼저 Visual Studio 2015 RC와 SDK RC를 다운로드해 설치해야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Visual Studio 2015 RC ; <a target='tab' href='https://www.visualstudio.com/products/visual-studio-2015-downloads-vs'>https://www.visualstudio.com/products/visual-studio-2015-downloads-vs</a> Visual Studio 2015 SDK RC ; <a target='tab' href='http://go.microsoft.com/?linkid=9877247'>http://go.microsoft.com/?linkid=9877247</a> </pre> <br /> Visual Studio가 좀 오래 걸릴 뿐 SDK의 경우에는 129MB로 빠르게 설치가 됩니다.<br /> <br /> 그다음, github의 roslyn repo를 clone해야 하는데요. 제 경우에는 github의 제 계정으로 fork한 다음에 거기서 로컬로 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;' > Visual Studio에서 github 오픈 소스를 fork해서 테스트하는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/10810'>http://www.sysnet.pe.kr/2/0/10810</a> ; <a target='tab' href='https://github.com/stjeong/roslyn.git'>https://github.com/stjeong/roslyn.git</a> </pre> <br /> 이후 e:\roslyn에 clone한 걸로 가정하고 설명합니다.<br /> <br /> <img alt='roslyn_test_1.png' src='/SysWebRes/bbs/roslyn_test_1.png' /><br /> <br /> 이제 roslyn에 엮인 nuget 패키지를 내려받기 위해 cmd 창을 열고 다음과 같이 실행해 줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > E:\roslyn><span style='color: blue; font-weight: bold'>src\.nuget\nuget restore Src\RoslynLight.sln</span> Installing 'FakeSign 0.9.2'. Installing 'Microsoft.Net.ToolsetCompilers 1.0.0-rc3-20150510-01'. Installing 'Microsoft.Net.RoslynDiagnostics 1.0.0-rc3-20150510-01'. Installing 'System.Reflection.Metadata 1.0.21'. Installing 'System.Collections.Immutable 1.1.36'. Successfully installed 'System.Reflection.Metadata 1.0.21'. Successfully installed 'FakeSign 0.9.2'. Successfully installed 'System.Collections.Immutable 1.1.36'. Successfully installed 'Microsoft.Net.RoslynDiagnostics 1.0.0-rc3-20150510-01'. Successfully installed 'Microsoft.Net.ToolsetCompilers 1.0.0-rc3-20150510-01'. Installing 'xunit 1.9.2'. Successfully installed 'xunit 1.9.2'. Installing 'xunit 2.0.0-alpha-build2576'. Installing 'Microsoft.CodeAnalysis.Test.Resources.Proprietary 1.0.0-rc3-20150528-03'. Installing 'Microsoft.DiaSymReader.Native 1.0.0-rc2'. Installing 'Microsoft.DiaSymReader 1.0.5'. Installing 'Moq 4.2.1402.2112'. Successfully installed 'xunit 2.0.0-alpha-build2576'. Installing 'xunit.abstractions 2.0.0-alpha-build2576'. Successfully installed 'Microsoft.DiaSymReader 1.0.5'. Installing 'xunit.core 2.0.0-alpha-build2576'. Installing 'MDbg 0.1.0'. Installing 'Microsoft.Composition 1.0.27'. Successfully installed 'xunit.abstractions 2.0.0-alpha-build2576'. Installing 'xunit.extensions 1.9.2'. Successfully installed 'Microsoft.DiaSymReader.Native 1.0.0-rc2'. Successfully installed 'Moq 4.2.1402.2112'. Successfully installed 'xunit.core 2.0.0-alpha-build2576'. Successfully installed 'Microsoft.Composition 1.0.27'. Installing 'xunit.assert 2.0.0-alpha-build2576'. Installing 'Microsoft.NetFX20 1.0.3'. Successfully installed 'xunit.assert 2.0.0-alpha-build2576'. Successfully installed 'xunit.extensions 1.9.2'. Successfully installed 'Microsoft.NetFX20 1.0.3'. Successfully installed 'Microsoft.CodeAnalysis.Test.Resources.Proprietary 1.0.0-rc3-20150528-03'. Successfully installed 'MDbg 0.1.0'. </pre> <br /> 이걸로 준비는 끝입니다. 이제 Visual Studio 2015에서 .\src\RoslynLight.sln 파일을 열고 빌드를 하면 나만의 C# 컴파일러가 생성됩니다. ^^ 또는, "Developer Command Prompt for VS2015" 명령행 창을 열어 msbuild 명령어를 직접 내려주면 됩니다. (명령행에서 한번 빌드해주고 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;' > E:\roslyn\src>msbuild RoslynLight.sln </pre> <br /> 참고로, 제가 컴파일한 시점에는 제법 빌드 오류가 많이 발생했는데요, 다음의 프로젝트를 unload시키고 빌드를 완료했습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Compilers / CSharp / CSharpWinRTTest VisualBasic / BasicCompilerEmitTest BasicCompilerTestUtilities ExpressionEvaluator / Core / CSharp / CSharpExpressionCompiler CSharpExpressionCompilerTest CSharpResultProvider.NetFX20 CSharpResultProvider.Portable VisualBasic / BasicExpressionCompiler BasicExpressionCompilerTest BasicResultProvider.NetFX20 BasicResultProvider.Portable Workspaces / VisualBasicServicesTest </pre> <br /> 빌드가 완료되면 다음의 폴더에 csc.exe 파일이 생성됩니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > E:\roslyn\Binaries\Debug </pre> <br /> 또한 다음의 폴더에도 csc.exe 관련 바이너리가 배포됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > %LOCALAPPDATA%\Microsoft\VisualStudio\14.0Roslyn\Extensions\MSOpenTech\OpenSourceDebug\0.7 </pre> <br /> 그리고 레지스트리에는 14.0Roslyn 이름으로 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;' > HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0Roslyn </pre> <br /> <hr style='width: 50%' /><br /> <br /> 자, 그럼 새롭게 빌드된 C# 컴파일러가 어떻게 사용되어지는 걸까요?<br /> <br /> 우선 우리가 만든 컴파일러임을 알 수 있도록 RoslynLight 솔루션의 Compilers / CSharp 하위에 있는 csc 프로젝트의 BuildClient.cs 파일을 열고 Microsoft.CodeAnalysis.BuildTasks.BuildClient 타입의 RunWithConsoleOutput 메서드에 다음과 같은 출력을 포함하고 다시 빌드를 하겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > public static int RunWithConsoleOutput( string[] args, string clientDir, string workingDir, string sdkDir, IAnalyzerAssemblyLoader analyzerLoader, RequestLanguage language, Func<string, string, string[], IAnalyzerAssemblyLoader, int> fallbackCompiler) { args = args.Select(arg => arg.Trim()).ToArray(); <span style='color: blue; font-weight: bold'>Console.Out.WriteLine("My C# Compiler v1");</span> // ...[생략]... } </pre> <br /> 그다음, 새롭게 구성된 환경(HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0Roslyn)의 영향을 받는 Visual Studio를 구동하기 위해 "Developer Command Prompt for VS2015" 명령행 창을 열어 다음과 같이 실행해줍니다. (단축 아이콘을 만들어 "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe /rootSuffix Roslyn"으로 설정하면 편합니다.)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > "%devenvdir%"\devenv.exe /rootSuffix Roslyn </pre> <br /> 새롭게 뜬 devenv.exe에서 C# 프로젝트를 하나 생성한 다음 빌드합니다. 그럼 rootSuffix == Roslyn으로 지정했기 때문에 Visual Studio는 "HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\<span style='color: blue; font-weight: bold'>14.0Roslyn</span>\ExtensionManager\EnabledExtensions" 키에 있는 "OpenSourceDebug..7922692f-f018-45e7-8f3f-d3b7c0262841,0.7" 항목에 설정된 "%LOCALAPPDATA%\Microsoft\VisualStudio\14.0Roslyn\Extensions\MSOpenTech\OpenSourceDebug\0.7\" 경로의 C# 컴파일러(csc.exe)를 구동하게 됩니다. <br /> 그런데, 정말로 우리가 방금 빌드한 C# 컴파일러를 호출했는지 어떻게 알 수 있을까요?<br /> <br /> 이를 확인하기 위해 "Tools" / "Options" 메뉴의 "Projects and Solutions" / "Build and Run" 항목에서 "MSBuild project build output verbosity" 값을 "Detailed"로 조정하고 다시 C# 프로젝트를 빌드해 봅니다. 그럼 출력 창에서 "Csc" Task 항목이 실행되는 부분에서 다음과 같이 우리가 빌드했던 csc.exe가 호출되었음을 확인할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ...[생략]... 1>Task "Csc" 1> %LOCALAPPDATA%\MICROSOFT\VISUALSTUDIO\14.0ROSLYN\EXTENSIONS\MSOPENTECH\OPENSOURCEDEBUG\0.7\csc.exe /noconfig /nowarn:1701,1702,2008 /nostdlib+ /platform:anycpu32bitpreferred /errorreport:prompt ...[생략]... obj\Debug\\TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs <span style='color: blue; font-weight: bold'>1> My C# Compiler v1</span> 1> Microsoft (R) Visual C# Compiler version 42.42.42.42 1> Copyright (C) Microsoft Corporation. All rights reserved. 1> ...[생략]... </pre> <br /> <hr style='width: 50%' /><br /> <br /> 이쯤했으면, 이제 F5 디버깅을 하고 싶을 것입니다. 이를 위해 RoslynLight 솔루션의 /Compilers/CSharp 하위에 "csc" 프로젝트를 "Set as StartUp Project"로 지정하고 프로젝트의 디버그 설정에 "Command line arguments"와 "Working directory"에 컴파일할 C# 소스코드과 경로를 적절하게 입력한 후,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Start Options - Command line arguments: program.cs - Working directory: c:\temp </pre> <br /> F5 키를 눌러 디버거 모드로 진입하면 됩니다. 당연히 BuildClient.cs 파일의 RunWithConsoleOutput 메서드에 BP를 걸어두었으면 실행이 멈추고 모든 디버깅 기능을 사용할 수 있습니다.<br /> <br /> 오~~~ 멋지지 않나요? ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> RoslynLight 솔루션 빌드시 다음과 같은 오류가 발생한다면?<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Could not copy "E:\roslyn\Binaries\Obj\OpenSourceDebug\Debug\OpenSourceDebug.dll" to "%LOCALAPPDATA%\Microsoft\VisualStudio\14.0Roslyn\Extensions\MSOpenTech\OpenSourceDebug\0.7\\OpenSourceDebug.dll". Exceeded retry count of 10. Failed. </pre> <br /> 이것은 "/rootsuffix Roslyn"의 영향을 받는 devenv.exe가 실행되어 있기 때문입니다. 왜냐하면 해당 devenv.exe는 %LOCALAPPDATA%\Microsoft\VisualStudio\14.0Roslyn\Extensions\MSOpenTech\OpenSourceDebug\0.7\\OpenSourceDebug.dll을 로드하고 있기 때문에 잠기므로 복사 오류가 발생한 것입니다. 따라서, 14.0Roslyn 환경셋으로 실행 중인 devenv.exe를 실행 종료한 후 다시 빌드하면 됩니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 참고로 git.exe를 직접 사용한다면 명령행에서 다음과 같이 간단하게 clone해서 빌드까지 완료할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > git clone https://github.com/stjeong/roslyn.git . src\.nuget\nuget restore Src\RoslynLight.sln cd src msbuild RoslynLight.sln cd .. </pre> <br /> 그리고 원래 repo로부터의 최신 버전 업데이트는 이렇게 하시면 됩니다.<br /> <br /> 최초 한번은 remote repo를 등록해주고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > git remote add dotnet/roslyn https://github.com/dotnet/roslyn.git </pre> <br /> 이후 필요할 때마다 이렇게 명령어를 실행하면 fork한 github 프로젝트가 최신으로 유지됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > git fetch dotnet/roslyn git merge dotnet/roslyn/master git push origin master </pre> </p><br /> <br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1517
(왼쪽의 숫자를 입력해야 합니다.)