C#/실습으로 다지는 C#

런타임에 라이브러리 로드하기 - .NET 리플렉션 [C#]

언제나 휴일 빅데이터 언제나휴일 2020. 7. 3. 08:51
반응형

 

테스트에 사용할 라이브러리 소스 코드(클래스 라이브러리로 제작)

using System;

namespace DemoLib
{
    public class Demo
    {
        int num;
        public int Num
        {
            get
            {
                return num;
            }
        }
        public int Add(int a,int b)
        {
            Console.WriteLine("Add 메서드 호출 됨:{0},{1}", a, b);
            return a + b;
        }
        public Demo(int n)
        {
            Console.WriteLine("Demo 생성자 호출됨:{0}", n);
            num = n;
        }
        public static void Foo(string msg)
        {
            Console.WriteLine("Foo 메서드 호출됨:{0}", msg);
        }
    }
}

명시적으로 어셈블리 로드하여 사용 예제(콘솔 응용으로 제작)

/* https://ehpub.co.kr
 * Reflection
 * 명시적 어셈블리 로딩                                                                                             
 */

using System;
using System.Reflection;

namespace 닷넷_리플렉션___명시적_어셈블리_로딩하여_사용하기
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Assembly asm = Assembly.Load("DemoLib");
                //Type[] types = asm.GetTypes();
                //foreach(Type type in types)
                //{
                //    Console.WriteLine(type);
                //}
                Type type = asm.GetType("DemoLib.Demo");
                object[] objs = new object[] { 5 };
                object demo_ins = Activator.CreateInstance(type,objs);

                PropertyInfo pi = type.GetProperty("Num");
                int num = (int)pi.GetValue(demo_ins);
                Console.WriteLine("번호:{0}", num);

                MethodInfo mi = type.GetMethod("Add");
                objs = new object[] { 3, 7 };
                int re = (int)mi.Invoke(demo_ins, objs);
                Console.WriteLine("반환:{0}", re);

                mi = type.GetMethod("Foo");
                objs = new object[] { "헬로우" };
                mi.Invoke(null, objs);
                
                Console.WriteLine("테스트 종료");
            }
            catch(Exception ex)
            {
                Console.WriteLine("예외 발생");
            }
        }
    }
}
반응형