Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

C# 컴파일러가 허용하지 않는 (유효한) 코드를 컴파일해 테스트하는 방법

아래의 질문이 있군요.

시작하세요 C# 7.1 프로그래밍 P53쪽 질문입니다.
; https://www.sysnet.pe.kr/3/0/5001

예전에 써 둔 글 중의 하나가 이와 관련해 답변이 될 듯 한데요.

C# 컴파일러는 변수를 초기화시키지 않을까요?
; https://www.sysnet.pe.kr/2/0/1651

그래도 다시 한번 간략하게 정리해 보겠습니다. ^^




그러니까 다음의 코드가 있는데,

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string text1;
            string text2 = null;

            Console.WriteLine(text1); // 컴파일 에러 - Error CS0165 Use of unassigned local variable 'text1'
            Console.WriteLine(text2);
        }
    }
}

사실 상, text1 변수와 text2 변수는 동일한 (null) 값을 가지고 있음에도 불구하고 text1의 경우 "사용자가 명시적으로 할당하지 않은" 상태로 사용하고 있기 때문에 C# 컴파일러는 컴파일 에러를 내버리는 것입니다.

만약, 저 코드를 그래도 실행해 보고 싶다면 어떻게 해야 할까요? 바로 IL 코드로 바꿔주면 됩니다. 이를 위해 일단, Console.WriteLine(text1); 코드를 주석 처리하고 빌드해 줍니다. 그렇게 나온 exe 파일을 ildasm.exe를 이용해 역어셈블합니다.

ildasm /out=test.il ConsoleApp1.exe

출력된 test.il 파일을 열어 Main 메서드의 구현을 보면 다음과 같이 되어 있습니다.

.class private auto ansi beforefieldinit ConsoleApp1.Program
       extends [mscorlib]System.Object
{
  .method private hidebysig static void  Main(string[] args) cil managed
  {
    .entrypoint
    // Code size       11 (0xb)
    .maxstack  1
    .locals init ([0] string text1,
             [1] string text2)
    IL_0000:  nop
    IL_0001:  ldnull
    IL_0002:  stloc.1
    IL_0003:  ldloc.1
    IL_0004:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_0009:  nop
    IL_000a:  ret
  } // end of method Program::Main}

따라서, IL 문법에 맞춰 string text1 변수의 값을 다음과 같이 출력하도록 바꿔주고,

  .method private hidebysig static void  Main(string[] args) cil managed
  {
    .entrypoint
    // Code size       11 (0xb)
    .maxstack  1
    .locals init ([0] string text1,
             [1] string text2)
    IL_0000:  nop
    IL_0001:  ldnull
    IL_0002:  stloc.1

    IL_1000:  ldloc.0   
    IL_1001:  call void [mscorlib]System.Console::WriteLine(string)

    IL_0003:  ldloc.1
    IL_0004:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_0009:  nop
    IL_000a:  ret
  } // end of method Program::Main

다시 ilasm.exe를 이용해 빌드하면 됩니다.

ilasm test.il /out=test.exe

그렇게 생성된 test.exe를 실행하면 다음과 같이 2번의 개행이 되어 출력되는 것을 볼 수 있습니다.

C:\ConsoleApp1\bin\Debug>test



C:\ConsoleApp1\bin\Debug>




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

[연관 글]






[최초 등록일: ]
[최종 수정일: 7/2/2018]

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

비밀번호

댓글 작성자
 




1  2  3  4  5  [6]  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13829정성태11/25/20246693스크립트: 67. 파이썬 - Windows 버전에서 함께 설치되는 py.exe
13828정성태11/25/20245182개발 환경 구성: 735. Azure - 압축 파일을 이용한 web app 배포 시 디렉터리 구분이 안 되는 문제파일 다운로드1
13827정성태11/25/20246011Windows: 273. Windows 환경의 파일 압축 방법 (tar, Compress-Archive)
13826정성태11/21/20246393닷넷: 2313. C# - (비밀번호 등의) Console로부터 입력받을 때 문자열 출력 숨기기(echo 끄기)파일 다운로드1
13825정성태11/21/20247050Linux: 110. eBPF / bpf2go - BPF_RINGBUF_OUTPUT / BPF_MAP_TYPE_RINGBUF 사용법
13824정성태11/20/20245426Linux: 109. eBPF / bpf2go - BPF_PERF_OUTPUT / BPF_MAP_TYPE_PERF_EVENT_ARRAY 사용법
13823정성태11/20/20246616개발 환경 구성: 734. Ubuntu에 docker, kubernetes (k3s) 설치
13822정성태11/20/20246494개발 환경 구성: 733. Windbg - VirtualBox VM의 커널 디버거 연결 시 COM 포트가 없는 경우
13821정성태11/18/20246100Linux: 108. Linux와 Windows의 프로세스/스레드 ID 관리 방식
13820정성태11/18/20246556VS.NET IDE: 195. Visual C++ - C# 프로젝트처럼 CopyToOutputDirectory 항목을 추가하는 방법
13819정성태11/15/20245131Linux: 107. eBPF - libbpf CO-RE의 CONFIG_DEBUG_INFO_BTF 빌드 여부에 대한 의존성
13818정성태11/15/20246679Windows: 272. Windows 11 24H2 - sudo 추가
13817정성태11/14/20245897Linux: 106. eBPF / bpf2go - (BPF_MAP_TYPE_HASH) Map을 이용한 전역 변수 구현
13816정성태11/14/20246852닷넷: 2312. C#, C++ - Windows / Linux 환경의 Thread Name 설정파일 다운로드1
13815정성태11/13/20245469Linux: 105. eBPF - bpf2go에서 전역 변수 설정 방법
13814정성태11/13/20246114닷넷: 2311. C# - Windows / Linux 환경에서 Native Thread ID 가져오기파일 다운로드1
13813정성태11/12/20246663닷넷: 2310. .NET의 Rune 타입과 emoji 표현파일 다운로드1
13812정성태11/11/202410268오류 유형: 933. Active Directory - The forest functional level is not supported.
13811정성태11/11/20245855Linux: 104. Linux - COLUMNS 환경변수가 언제나 80으로 설정되는 환경
13810정성태11/10/20246881Linux: 103. eBPF (bpf2go) - Tracepoint를 이용한 트레이스 (BPF_PROG_TYPE_TRACEPOINT)
13809정성태11/10/20246513Windows: 271. 윈도우 서버 2025 마이그레이션
13808정성태11/9/20246827오류 유형: 932. Linux - 커널 업그레이드 후 "error: bad shim signature" 오류 발생
13807정성태11/9/20245684Linux: 102. Linux - 커널 이미지 파일 서명 (Ubuntu 환경)
13806정성태11/8/20245862Windows: 270. 어댑터 상세 정보(Network Connection Details) 창의 내용이 비어 있는 경우
13805정성태11/8/20245471오류 유형: 931. Active Directory의 adprep 또는 복제가 안 되는 경우
13804정성태11/7/20247065Linux: 101. eBPF 함수의 인자를 다루는 방법
1  2  3  4  5  [6]  7  8  9  10  11  12  13  14  15  ...