1. Reflection
// 어셈블리 로딩(filename : asname)
Assembly as1 = Assembly.LoadFrom(asname);
// 어셈블리로부터 Type 리스트 가져오기
Type[] types = as1.GetTypes();
// Type의 기본정보
foreach(Type t in types)
{
Console.WriteLine(t.FullName); // 타입이름
Console.WriteLine(t.BaseType); // 기본타입
Console.WriteLine(t.IsClass); // 클래스인가?
Console.WriteLine(t.IsSealed); // 추상클래스인가?
}
// Type의 멤버 얻어오기
MemberInfo[] mInfos = t.GetMembers();
// Type의 멤버타입
foreach(MemberInfo mInfo in mInfos)
{
string str = "기타";
if(mInfo.MemberType == MemberTypes.Field) {str = "필드";}
if(mInfo.MemberType == MemberTypes.Method) {str = "메소드";}
if(mInfo.MemberType == MemberTypes.Constructor){str = "생성자";}
if(mInfo.MemberType == MemberTypes.Property) {str = "속성";}
if(mInfo.MemberType == MemberTypes.Event) {str = "이벤트";}
Console.WriteLine("{0} : {1}", str, mInfo.Name);
}
// field 리스트 가져오기
FieldInfo[] fInfos = t.GetFields();
// Method 리스트 가져오기
MethodInfo[] methodInfos = t.GetMethods();
// Method의 Parameter 리스트 가져오기
foreach(MethodInfo methodInfo in methodInfos)
{
ParameterInfo[] pInfos = methodInfo.GetParameters();
}
// 생성자 리스트 가져오기
ConstructorInfo[] cInfos = t.GetConstructors();
// 속성 리스트 가져오기
PropertyInfo[] propertyInfos = t.GetProperties();
// 이벤트 리스트 가져오기
EventInfo[] eInfos = t.GetEvents();
// Type으로부터 오브젝트 생성
object o = Activator.CreateInstance(Type);
// Type의 메소드 실행
Type.InvokeMember(...); // MSDN 참조
2. 어트리뷰트
* 실행 시점에서 특정한 정보를 전달하기 위한 일종의 선언으로 어셈블리의
메타데이터에 함께 저장된다.
// Conditional
// 아래의 경우 DEBUG와 CDEBUG가 define되어있어야 아래의 함수가 유효하다.
// 또한, 클래스나 구조체의 메소드에만 사용 가능하다.
// 해당 메소드의 호출 명령 부분이 컴파일시 제외된다.
[Conditional("DEBUG"), Conditional("CDEBUG")]
public static void c1()
{
}
// DllImport
// Unmanaged 코드를 사용할 수 있도록 한다.
// MessageBox 원형의 파라메터는(HWND, LPCTSTR, LPCTSTR, UINT)이지만
// 아래와 같이 약간 다르게 extern으로 선언해서 사용할 수 있다.
[DllImport("User32.dll")]
public static extern int MessageBox(int h, string m, string c, int type);
// Obsolete
[Obsolete ("Some Comment")]
public static void obsolete1()
{
}
ㅁ