본문 바로가기

C#/MSIL

[MSIL] 람다식의 캡쳐 구현하기 쓰다말음 void Foo(int a, int b, int c) { return a + b + c; } var Foo2 = (int c) => { return Foo(10, 20, c); }; 위의 경우처럼 함수의 인자를 줄이기 위해서 람다식을 사용하는 경우가 있다.c++의 std::bind 같은 메소드가 제공되면 편하겠지만, C#은 그러한 메소드를 제공하지는 않는다. 정상적인 코드라면 그러한 메소드를 사용하는것보다 람다함수의 캡쳐를 쓰는게 훨씬 낫기 때문에. 하지만 런타임에 위 코드처럼 어떤 메소드의 인자를 줄이고 싶은 상황에서는 상당히 불편하다. 따라하기 위해서는 먼저 C# 컴파일러가 람다와 캡처를 어떻게 처리하는지를 알아야 할 필요가 있다. (보고 배끼기 위해서) string message = "He.. 더보기
CLR에서 돌아가는 언어를 뭔가를 만들어 보면서 https://github.com/pjc0247/ILIL 얼마 전에 ILIL이라는 이름으로, CLR환경에서 돌아가고 CIL로 컴파일되는 언어를 만들어보고자 하는 프로젝트를 진행했었다(개인적으로). 이번 프로젝트의 제작 의의는, 단순히 컴파일러 그 자체를 만들어보고, 결과물을 CIL로 출력해서, C# 또는 C++에서 콜해보는게 목적이었고, 어느 정도 작성한후에는 코드도 같이 Github에 공개할 예정이었다. (깃허브에 올려도 바다-나무님밖에 안보긴함)그리고 최종적으로는 완성된 ILIL 컴파일러를 이용해 아래 코드와 같이 Reflection.Emit을 대체할 물건을 만드려고 했다. var src = @" $loc0 = 0; for($loc1 = 0; $loc1 더보기
[MSIL] 런타임 property 구현하기 1. '_propertyName' 이름을 가지는 backing field를 만든다. ( C# 컴파일러가 만들어내는 실제 backing field 이름은 이것과 다르다 )2. 'get_propertyName' 이름을 가지는 getter 메소드를 만든다. 메소드가 MethodAttributes.SpecialName 속성을 가지는것을 기억하자.3. 'set_propertyName' 이름을 가지는 setter 메소드를 만든다. setter는 1개의 파라미터를 가진다. (value) 더보기
[MSIL] beforefieldinit beforefieldinit는 타입이 초기화(정적 생성자, cctor)되는 시점을 슈퍼-레이지하게 만들어준다. 슈퍼 레이지하다는것은, 스태틱 메소드중에 필드에 접근하지 않는 애는 호출이 되어도 초기화를 스킵한다는 뜻이다. 위 코드에서 PrintHello는 그냥 HelloWorld만 출력한다. 반면에 PrintHelloWithField는 HelloWorld를 찍은 뒤, 굳이 필드에 일부러 접근하는 동작을 가진다. 마지막으로 정적 생성자가 호출되는 시점을 알 수 있도록 CCTOR라는 메세지를 출력하도록 했다. 위의 코드를 실행하면 단순히 HelloWorld가 출력되는 모습을 볼 수 있는데, 이는 Foo 클래스는 beforefieldinit 속성을 가지고있기 때문에 PrintHello를 불러도 정적 생성자가 .. 더보기
[MSIL] for loop 첫번째 인자로 넘어온 int 숫자만큼 반복하는 메소드그냥 x86 어셈블리 지식을 더듬어 혼자 짠 코드라, 제대로된 C# 컴파일러가 빌드하는 코드와는 다를 수 있다. 더보기