[.NET Compact Framework-C#] Reflection을 이용한 인스턴스 생성하기
Reflection 을 이용하여 인스턴스를 생성하는 방법으로 .NET Framework 에서도 공통적으로 사용할 수 있을 것으로 예상되지만 일단 .NET Compact Framework 에서 확인한 사항이다.
1. 일반적인 인스턴스 생성
- 클래스 이름 문자열로 A라는 클래스의 인스턴스를 생성하려면 다음과 같이 한다.(GetType 내의 인자는 클래스의 full path를 사용해야 한다.)
System.Type type = System.Type.GetType("alpha.A");
A a = (A)System.Activator.CreateInstance(type);
- 위 구문은 다음과 같은 작동을 한다.
A a = new A();
2. 외부 DLL 내의 인스턴스 생성
- 클래스 이름 문자열로 import.dll 이라는 외부 DLL내의 B라는 클래스의 인스턴스를 생성하려면 다음과 같이 한다.(GetType 내의 인자는 클래스의 full path를 사용해야 하며 import.dll은 실행파일과 같은 경로에 있다고 가정한다.)
System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(@".\import.dll");
System.Type type = assembly.GetType("alpha.B");
B b = (B)System.Activator.CreateInstance(type);
3. 활용
아래 예제는 만들어진 Base 클래스를 상속받은 실행파일 내의 R001 클래스와 Import.dll 내의 R002 클래스를 생성하고 실행하는 예제이다. 자세한 내용은 첨부된 소스를 참고한다.
예제소스 다운로드
private void buttonRun_Click(object sender, EventArgs e)
{
textBoxResult.Text = "";
// 클래스 이름이 입력되었는지 검사한다.
if (textBoxClassName.Text.Length == 0)
{
MessageBox.Show("Must input class name!", "Notice",MessageBoxButtons.OK,MessageBoxIcon.Exclamation,MessageBoxDefaultButton.Button1);
return;
}
Type type = null;
try
{
// Import.dll을 로드한다.
Assembly assembly = Assembly.LoadFrom(@".\Import.dll");
// 로딩된 DLL에서 클래스 타입을 얻는다.
type = assembly.GetType("Kr.Vsys.Test.Reflection." + textBoxClassName.Text);
// 클래스가 없을 경우 예외를 발생시킨다.
if (type == null)
{
throw new Exception();
}
}
catch (Exception)
{
// DLL이 없거나 DLL내에 원하는 클래스가 없을 경우 실행파일에서 클래스 타입을 얻는다.
type = Type.GetType("Kr.Vsys.Test.Reflection." + textBoxClassName.Text);
}
// 실행파일과 DLL에 모두 클래스가 없을 경우 메시지 박스를 출력한다.
if (type == null)
{
MessageBox.Show("Can't find class : " + textBoxClassName.Text, "Notice",MessageBoxButtons.OK, MessageBoxIcon.Exclamation,MessageBoxDefaultButton.Button1);
return;
}
// 얻은 클래스 타입의 인스턴스를 생성한다.
Base instance = (Base)System.Activator.CreateInstance(type);
// 화면에 출력한다.
string result = "";
result += "- Class Name(Full Name)\r\n";
result += " " + instance.GetType().FullName + "\r\n";
result += "- Result\r\n";
result += " " + instance.run() + "\r\n";
textBoxResult.Text = result;
}
'개발 관련 글' 카테고리의 다른 글
#.[ASP.NET] 닷넷 기술 문제 Part1 [C# 언어 부분] (0) | 2013.10.16 |
---|---|
C# 네트워크 프로그래밍 (0) | 2013.07.24 |
Socket 파일 전송 예제 (1) | 2013.07.24 |
Compact framework 정보 (0) | 2013.06.11 |
[VS2010] C#에 C++로 만든 DLL 파일 추가하기 (0) | 2013.06.02 |