Programming/.NET

System.Reflection.Assembly를 이용하면 어셈블리(DLL)의 직접적인 참조없이 동적으로 DLL을 로드하고 사용할 수 있습니다. 이 방법을 살펴보기 전에 아래와 같이 간단한 DLL을 만들어 보겠습니다.

 

namespace myDll
{
    public class Class1
    {
        public Class1()
        { }

        public object myCal(int i, int j)
        {
            return i + j;
        }
    }
}

 

이를 컴파일하면 myDll.dll이 생성된다고 가정해 보겠습니다.

 

Assembly asm = Assembly.LoadFrom(@"C:\Users\testuser\Documents\Visual Studio 2015\Projects\test\myDll\bin\Debug\myDll.dll");
Type t = asm.GetType("myDll.Class1");

 

우선 Assembly의 LoadFrom 메서드를 통해 로드할 어셈를리(DLL)의 위치를 잡아주고 GetType으로 어셈블리 타입정보를 추출하도록 합니다.

 

ConstructorInfo ci = t.GetConstructor(Type.EmptyTypes);
object oci = ci.Invoke(null);

 

Type의 GetConstructor 메소드에서 Type.EmptyTypes를 지정하면 해당 타입의 기본생성자를 반환하며 Constructorinfo에서 invoke를 통해 반환받은 생성자를 호출하여 타입의 객체를 생성하게 됩니다.

 

MethodInfo mi = t.GetMethod("myCal");

object[] i = new object[2];
i[0] = 10;
i[1] = 20;

object r = mi.Invoke(oci, i);

 

객체가 생성되었으니 이제 메서드등의 타입을 호출할 수 있습니다. 위에서는 GetMethod를 통해 myCal을 지정하여 해당 메소드타입을 가져올 수 있도록 하였습니다. invoke는 지정된 메서드를 호출하기 위함인데 만약 메서드에 매개변수를 전달해야 한다면 invoke의 두번째 인자로 필요한만큼의 배열을 생성하여 전달하면 됩니다. invoke호출시 따로 매개변수 전달이 필요없다면 null을 지정합니다.

 

위와 같이 Assembly를 활용한다면 꽤 덩치가 큰 솔루션을 개발할때 사용자가 필요한 기능을 직접 개발하도록 하고 이를 확장프로그램형식으로 활용할 수 있는 방안을 제공할 수 있습니다. 이는 엑셀이나 워드같은 프로그램에서 사용자 정의된 기능이 필요할때 이를 확장프로그램형식으로 탑재하고 사용할 수 있도록 하는 것이나 크롬이나 익스플로러같은 웹브라우저에서 직접 사용자 정의 프로그램을 만들 수 있도록 하는것과같은 방식의 구현이 가능함을 의미합니다.

'Programming > .NET' 카테고리의 다른 글

[C#] nameof  (0) 2017.12.27
[ASP.NET MVC] AJAX  (0) 2017.12.22
[C#] Assembly  (0) 2017.12.13
[C#] LINQ  (0) 2017.12.05
[C#] 문자열 보간 ($)  (0) 2017.11.28
[C#] ArrayList  (0) 2017.11.14
0 0