간단히 말하면 런타임으로 동적으로 다양한 작업을 하고자 할 때 사용합니다.
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와 같은 것을 만들 수도 있겠습니다.
이 부분은 나중에 개념 잡으시면서 접해보도록 하십시오.