App Programming/C#2007. 2. 7. 09:20

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


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와 같은 것을 만들 수도 있겠습니다.

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




Posted by BAGE