Assembly 정보 얻기

2021. 5. 11. 11:16

 Type.Memberinfo 클래스를 이용하여 Assembly의 각종 정보를 얻을 수 있다. 멤버변수의 이름, 메소드의 이름, 파라메터, 프로퍼티, 이벤트 등등 거의 모든 정보를 얻을 수 있다. 본 예제는 이중 멤버변수, 메소드, 프로퍼티 등 의 이름을 string 타입으로 리턴 받는다.

 

 동적으로 load한 어셈블리를 다룰때 한가지 주의사항이 있다. main AppDomain에서 직접 어셈블리를 load하지 않아도 type 클래스의 객체로 해당 어셈블리의 정보를 리턴 받는다면 내부적으론 main AppDomain에서 직접 어셈블리를 load한다. 그럼 동적으로 load한 어셈블리의 unload가 불가능해진다(프로그램 종료 전까지는). 때문에 main AppDomain이 아닌 sub AppDomain에서 어셈블리를 load하여 해당 정보를 확인한다.

 

 

[추가]. MemberInfo 외에도 FieldInfo, MethodInfo 등 의 클래스를 이용하면 보다 자세한 정보를 얻을 수 있다.

 

 

ClassLibrary.dll

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ClassLibrary
{
    public class Class
    {
        public event EventHandler handler;

        public string publicMember;
        private string privateMember;
        

        public string publicProperty
        {
            get
            {
                return "property";
            }
        }

        public Class()
        {
            //
        }

        public Class(string para1, string para2)
        {
            //
        }

        public void PublicMethod()
        {
            //
        }

        private void PrivateMethod()
        {
            //
        }

        public virtual void VirtulaMethod()
        {
            //
        }

        public static void StaticMethod()
        {
            //
        }
    }
}

 

 

AssemblyLoader.cs

public void GetAsmMembers()
{
    Type[] types = this.m_Assembly.GetTypes();

    List<string> constructors = new List<string>();
    List<string> events = new List<string>();
    List<string> fields = new List<string>();

    List<string> usrMethods = new List<string>();
    List<string> sysMethods = new List<string>();


    List<string> propertys = new List<string>();

    foreach (Type type in types)
    {
        if (type.IsClass)
        {

            foreach (System.Reflection.MemberInfo member in type.GetMembers())
            {
                switch (member.MemberType)
                {
                    case MemberTypes.Constructor:
                        constructors.Add(member.Name);
                        break;

                    case MemberTypes.Event:
                        events.Add(member.Name);
                        break;

                    case MemberTypes.Field:
                        fields.Add(member.Name);
                        break;

                    case MemberTypes.Method:
                        //isStatic
                        //isVirtur
                        //isSpecialName                                
                        if (member.DeclaringType.FullName != "System.Object")
                        {
                            //User Function
                            usrMethods.Add(member.Name);
                        }
                        else
                        {
                            //Sysmtem Function
                            sysMethods.Add(member.Name);
                        }
                        break;

                    case MemberTypes.Property:
                        propertys.Add(member.Name);
                        break;
                }
            }
        }
    
    }
    
}

 

실행화면

 

 

 

 


GitHub : github.com/KimUS94/GetAssemblyMember

 

BELATED ARTICLES

more