Unit Test에서 사용되는 NUnit를 보면 [Test] attribute와 [TestFixture] attribute를 이용해서 각각의 Test Class와 Method를 모두 얻어내게 된다.
먼저, Assembly의 Load는 간단하게 Assembly의 static method를 통해서 얻어올 수 있다.
Assembly assem = Assembly.LoadFile(PlugInFileName);
여기에서 Assembly의 각 Class의 Attribute의 조건을 얻어오기 위해서 static class를 하나 생성
public static bool HasAttribute(MemberInfo member, string attrName, bool inherit)
{
object[] attributes = member.GetCustomAttributes(inherit);
foreach(Attribute attribute in attributes)
{
if(IsInstanceOfType(attrName, attribute))
{
System.Diagnostics.Debug.WriteLine(attribute);
return true;
}
}
return false;
}
얻어진 결과를 linq를 이용해서 검색. (이런 곳에서도 linq는 이용 가능하다. ^^)
var types = from t in assem.GetTypes()
where Reflect.HasAttribute(t, typeName, true)
select t;
이렇게 얻어온 Class를 Activator를 이용해서 Instance를 생성해주면 외부 assembly가 가지고 있는 class의 동적 이용 및 NUnit과 비슷한 동작을 하는 것이 가능해진다.
ISYNCmailPlugIn plugIn = Activator.CreateInstance(type) as ISYNCmailPlugIn;
Remote에서 사용하게 될 경우에 장점은 다음과 같다.
1. Compile시에 Dll이 필요하지 않다.
: 동적 load가 되기 때문에 잦은 변경이 있는 lib인 경우에 사용이 편리하다.
2. 특정한 Interface나 Attribute를 가지고 있는 경우에 외부에서 사용이 가능하다.