성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
[정성태] 만드실 수 있습니다. 단지, Unity 엔진 내의 스크립트와 W...
글쓰기
제목
이름
암호
전자우편
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'>Visual Studio에서 직접 컴파일하는 IL 언어 확장 도구 - IL Support</h1> <p> 물리적인 머신에 들어가는 CPU가 기계어를 해석하고, 그 기계어에 거의 1:1 매핑을 시켜 만든 언어가 바로 "어셈블리(Assembly)" 입니다. (닷넷의 배포단위인 '어셈블리'와 혼동하시면 안됩니다.)<br /> <br /> 그리고, JVM과 CLR은 일종의 가상머신입니다. 따라서 각각의 가상머신 환경에도 기계어 레벨에 대응하는 표현이 있는데 자바의 경우 Byte Code, 닷넷은 IL(Intermediate Language)이 됩니다. 그렇다면 기계어와 대응되는 어셈블리가 언어가 있었던 것처럼 JVM/CLR 가상머신에서도 그와 같은 언어가 있지 않을까요?<br /> <br /> 맞습니다. 자바라면 <a target='tab' href='http://jasmin.sourceforge.net/'>Jasmine</a>이 있고, 닷넷에는 "IL 언어"가 있습니다. 가령 IL 언어로 Hello World 프로그램을 만들면 다음과 같이 코딩을 할 수 있습니다.<br /> <br /> [소스 코드 1]<br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > .assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) .ver 4:0:0:0 } .assembly ConsoleApplication1 { .hash algorithm 0x00008004 .ver 1:0:0:0 } .module ConsoleApplication1.exe .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 .corflags 0x00000001 .class private auto ansi beforefieldinit Program extends [mscorlib]System.Object { .method private hidebysig static void Main(string[] args) cil managed { .entrypoint // Code size 13 (0xd) .maxstack 8 IL_0000: nop IL_0001: ldstr "Hello World" IL_0006: call void [mscorlib]System.Console::WriteLine(string) IL_000b: nop IL_000c: ret } } </pre> <br /> 이 때문에 닷넷 환경에서 실행되는 언어를 만드는 개발자가 있다면 2가지 방법으로 가능합니다.<br /> <br /> <ol> <li>직접 PE 포맷을 따르는 닷넷 모듈을 출력하는 컴파일러 개발</li> <li>IL 언어로 변환하는 컴파일러 개발, PE 포맷의 모듈은 ilasm.exe에게 대행</li> </ol> <br /> 예를 들어, 제가 Output 함수만 제공하는 새로운 K#이라는 언어를 만들었다면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // K# 언어 사용법 // Output 함수 뒤에 출력할 문자열 지정, 그외 기능은 없음! Output "TEST" </pre> <br /> 이 소스코드를 컴파일하는 KSC.exe 컴파일러 프로그램은 단지 "[소스 코드 1]"에서 살펴봤던 IL 텍스트 출력의 "Hello World" 문자열만 "TEST"로 바꿔 파일로 저장한 다음 ilasm.exe에 의해 닷넷 모듈로 컴파일하는 방법을 선택할 수 있습니다.<br /> <br /> 이 방법이 꽤나 현실성이 있는 이유가, 모든 닷넷 프레임워크는 기본적으로 ilasm.exe를 함께 설치해 주기 때문입니다.<br /> <br /> 새로운 닷넷 언어 만들기 참 쉽죠??? ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> 어쨌든, 그런 IL 언어를 다루려면 기존에는 명령행 창(cmd.exe)에서 ilasm.exe와 ildasm.exe를 이용해야만 했는데 아래의 도구를 사용하면 Visual Studio에서 IL 언어를 직접 다루는 프로젝트를 생성할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > IL Support ; <a target='tab' href='http://visualstudiogallery.msdn.microsoft.com/44034a7b-143d-4b51-b7bc-99aa656ba137'>http://visualstudiogallery.msdn.microsoft.com/44034a7b-143d-4b51-b7bc-99aa656ba137</a> Moving Memory in .NET using VB and the CIL ; <a target='tab' href='http://www.codeproject.com/Articles/767624/Moving-Memory-in-NET-using-VB-and-the-CIL'>http://www.codeproject.com/Articles/767624/Moving-Memory-in-NET-using-VB-and-the-CIL</a> </pre> <br /> 아쉽게도 Visual Studio 2010, 2012에서만 설치가 되는데요. "Tools" / "Extension Manager..." 메뉴를 선택하고 다음과 같이 "Online Gallery"에서 "IL Support"로 검색하면 찾을 수 있습니다.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='il_support_1.png' src='/SysWebRes/bbs/il_support_1.png' /><br /> <br /> 설치하고 나면, 다음과 같이 "IL Support" 관련 프로젝트 템플릿이 생성되고,<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='il_support_2.png' src='/SysWebRes/bbs/il_support_2.png' /><br /> <br /> 기본 제공되는 Program.cs 파일에는 IL 언어에 정의되는 메서드로 실행을 전달하는 MethodImplOptions.ForwardRef 특성이 정의된 선언이 있고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Text; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { } <span style='color: blue; font-weight: bold'>[MethodImpl(MethodImplOptions.ForwardRef)] public static extern int Square(int number);</span> } } </pre> <br /> 함께 제공되는 Program.il 파일에 코드를 담은 Square 메서드가 IL 언어로 정의되어 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > .class public ConsoleApplication2.Program { .method public static int32 Square(int32 number) cil managed { .maxstack 2 ldarg.0 dup mul ret } } </pre> <br /> 재치있군요. ^^ 별로 쓸모없을 것 같았던 MethodImpl 특성의 MethodImplOptions.ForwardRef 옵션을 이용해서 멋지게 C# 프로젝트와 통합을 시켰습니다.<br /> <br /> 물론, Hello World를 출력하는 우리의 함수를 다음과 같이 추가할 수도 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Text; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { HelloWorld(); } [MethodImpl(MethodImplOptions.ForwardRef)] public static extern int Square(int number); <span style='color: blue; font-weight: bold'>[MethodImpl(MethodImplOptions.ForwardRef)] public static extern void HelloWorld();</span> } } </pre> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > .class public ConsoleApplication2.Program { .method public static int32 Square(int32 number) cil managed { .maxstack 2 ldarg.0 dup mul ret } <span style='color: blue; font-weight: bold'> .method public static void HelloWorld() cil managed { .maxstack 8 IL_0000: nop IL_0001: ldstr "Hello World" IL_0006: call void [mscorlib]System.Console::WriteLine(string) IL_000b: nop IL_000c: ret }</span> } </pre> <br /> 비록, IL 언어를 직접적으로 쓸 일이 거의 없지만... 이것으로 비로소 "IL 언어"도 Visual Studio가 지원하는 ".NET 호환 언어"로써의 반열에 오르게 되는군요. ^^ (애석하게도 intellisense같은 기능은 없지만!)<br /> <br /> 참고로, 갤러리에는 올라오지 않았지만 현재 Visual Studio 2013을 지원하는 소스코드로는 업데이트되었습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > hross/ILSupport ; <a target='tab' href='https://github.com/hross/ILSupport'>https://github.com/hross/ILSupport</a> </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1427
(왼쪽의 숫자를 입력해야 합니다.)