http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNo=8&no=33805&ref=33729


간단히 말하면 런타임으로 동적으로 다양한 작업을 하고자 할 때 사용합니다.

 

1) 다음과 같이 메타 정보를 런타임에 얻고자 할 경우

 

메타 정보란 응용프로그램의 기능와 상관없는 정보

=> 실제 작업코드가 아닌 정보들...

=> 그 파일에 따라다니는 파일과 관련된 정보들

 

private string FileVersion()

{

    Assembly asm=Assembly.LoadFrom(@"C:\abc.exe");

    AssemblyName name=asm.GetName();

 

    return name.Version.ToString();

}

 

라이브러리를 개발하면서 유지보수 내용을 기록하고 이런 메타 정보를 얻어서 유지보수등에 도움을 받기도 하고...

 

2) 어셈블리의 내용을 알고자 할 때

이벤트, 필드, 메소드 등등

 

Assembly asm = Assembly.Load("Mscorlib.dll");

Type[] types = asm.GetTypes();

foreach(Type t in types)

{

    Console.WriteLine("Type : {0}", t)

}

 

3) 개체의 이름으로 개체의 인스턴스 만들기

=> 융통성 있는 코드를 작성할 수 있습니다.

 

예를 들어

다음과 같이 하면 오직 Form1만 열게 되고

private void OpenForm1()

{

    Form frm = new Form1();

    frm.Show();

}

 

다음과 같이 switch 구문을 사용해도 폼이 추가되면 또 코드를 수정해야 되고

private void OpenForm(string formName)

{

    Form frm = null;

 

    switch(formName)

    {

        case "Form1":

            frm = new Form1;

            break;

        case "Form2":

            frm = new Form2;

            break;

        ....

    }

    frm.Show();

}

 

그러나 리플렉션을 이용하면...

  

private button1_Click(.....)

{

    OpenFormByName(this.textBox1.Text);

}

 

private void OpenFormByName(string formName)

    Assembly am = Assembly.GetEntryAssembly();

    string fullName = asm.ToString() + "." + formName;

 

    // 리플렉션: 이름(문자정보)으로 해당 타입을 알아내는 것

    // => 이름을 주고 '요놈이 누구인가 찾아주세요' 하면 심사숙고해서 (리플렉션) 결과를 찾아주는 것.

    Type t = Type.GetType( fullName );

 

    // 후기 바인딩: 타입을 가지고 인스턴스를 만들고

    object o = Activator.CreateInstance(t);

 

    // 폼을 보여 줌

    Form f = (Form) o;

    f.Show();

}

 

 

또 이렇게 폼을 리플렉션을 이용하여 작업을 하게되면

폼을 독립된 DLL 파일로 개발하고

폼을 업데이트 하는 경우 해당 DLL 파일만 업데이트 하면 되고....

 

4) COM 개체를 후기바인딩으로 불러 사용

 

private void OpenExcel()

{

    // 리플렉션

    Type excel = Type.GetTypeFromProgID("Excel.Microsoft");

 

    // 후기바인딩

    object objExcel = Activator.CreateInstance(excel)

    object[] param = object[1];

    param[0]=true;

    excel.InvokeMember("Visible", BindingFlags.SerProperty, null, objExcel, param);

}

 

이렇듯 런타임에 동적으로(융통성있게) 개체를 가지고 작업을 할 수 있습니다.

 

후기바인딩으로 인스턴스를 만드는데 쓰이는

Activator의 메소드들은 다음과 같습니다.

 

    CreateComInstanceFrom()

    CreateInstanceFrom()

    GetObject()

    CreateInstance()

 

도움말을 한번 찾아보십시오.

이것을 알면 리플렉션을 어떻게 사용할 것인가에 대해 좀더 알 수도 있을 겁니다.

 

5) 런타임으로 스크립트를 작성하고 실행하거나 컴파일을 하거나 새로운 타입을 동적으로 생성하는 등

고급 작업을 할 수 있습니다.

기타 VS.NET의 IDE와 같은 것을 만들 수도 있겠습니다.

이 부분은 나중에 개념 잡으시면서 접해보도록 하십시오.



반응형

+ Recent posts