본문 바로가기

ASP.NET

ASP.NET 프로젝트에서 런타임에 참조된 어셈블리 불러오기

ASP.NET 프로젝트에서는 Visual Studio에서 참조된 어셈블리 외에도 bin 폴더에 포함된 모든 어셈블리를 참조된 어셈블리로 인식합니다.
외부에서 컴파일 된 어셈블리 또한 런타임에 bin폴더로 추가하여도 정상적으로 동작하게 됩니다.

그렇다면, ASP.NET 프로젝트에서 참조된 모든 어셈블리의 목록을 어떻게 가져올 수 있을까요?
이는 System.Web.Compliation.BuildManager 클래스의 GetReferencedAssemblies 정적 메서드를 이용하여 알 수 있습니다.

만일 참조된 어셈블리에 존재하는 WCF RIA Services의 DomainService의 하위 클래스의 목록을 가져오려 한다면 아래와 같은 코드를 이용할 수 있습니다.

Dictionary<string, Type> dictionary = new Dictionary<string, Type>(StringComparer.OrdinalIgnoreCase);

Type type = typeof(DomainService);

 

foreach (Assembly assembly in BuildManager.GetReferencedAssemblies().Cast<Assembly>())

{

    Type[] exportedTypes = null;

    try

    {

        exportedTypes = assembly.GetExportedTypes();

    }

    catch (ReflectionTypeLoadException exception)

    {

        exportedTypes = exception.Types;

    }

    catch (Exception)

    {

    }

 

    if (exportedTypes != null)

    {

        foreach (Type type2 in exportedTypes)

        {

            if ((!type2.IsAbstract && !type2.IsInterface) &&

                (!type2.IsValueType && type.IsAssignableFrom(type2)) &&

                (TypeDescriptor.GetAttributes(type2)[typeof(EnableClientAccessAttribute)] != null))

            {

                string canonicalFileName = GetCanonicalFileName(type2);

                dictionary[canonicalFileName] = type2;

            }

        }

    }

}

위 코드에서는 BuildManager.GetReferencedAssemblies 메서드를 통하여 참조로 등록된 어셈블리들을 가져오고,
Type.IsAssignableFrom(Type) 메서드를 이용하여 현재 타입이 DomainService를 상속받고 있는지를 확인합니다.
그리고, TypeDescriptor.GetAttributes 메서드를 이용하여 등록된 특성 중에 EnableClientAccess 가 있는지를 확인하게 됩니다.

위와 같은 방식으로 BuildManager 클래스와 리플렉션을 이용하여 런타임에 참조된 어셈블리를 불러와서 다양한 활용이 가능해집니다.