C#에서 Dynamic하게 DLL의 Entity 타입 찾기 (AppDomain vs BuildManager)

2026. 7. 20. 15:08·Programming/C#.NET

개발을 하다 보면 DLL에 정의된 Entity를 동적으로 찾아서 사용해야 하는 경우가 있습니다. 최근 프로젝트에서 Reflection을 이용해 DLL에 포함된 Entity를 가져오는 작업을 진행했는데, 실행 환경에 따라 Assembly를 가져오는 방법이 달라 예상치 못한 문제를 겪었습니다.

이번 글에서는 AppDomain.GetAssemblies() 와 BuildManager.GetReferencedAssemblies() 의 차이점과 실제 경험한 이슈를 정리해보겠습니다.

 

상황

특정 Entity 이름을 기준으로 DLL 내부의 Type을 찾아야 하는 기능을 구현했습니다.

처음에는 현재 실행 중인 프로세스에 로드된 Assembly 목록을 가져오기 위해 아래와 같은 방법을 사용했습니다.

AppDomain.CurrentDomain.GetAssemblies()

 

하지만 Service를 IIS 환경에서 구동하는 경우, 필요한 DLL이 모두 로드되지 않아 원하는 Type을 찾지 못하는 문제가 발생했습니다.

결과적으로 Reflection으로 Type을 찾는 과정에서 객체 참조 오류(Null Reference Exception)가 발생했습니다.

 

Assembly 가져오는 방법

1. 일반 응용프로그램

일반적인 Console, WinForms, WPF 등의 애플리케이션에서는 AppDomain.GetAssemblies()를 사용할 수 있습니다.

public Assembly[] GetAssemblies()

 

현재 실행 중인 AppDomain에 로드된 Assembly 목록을 반환합니다.

사용 예시

foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
{
    foreach (Type t in a.GetTypes())
    {
        if (t.Name == entityName)
        {
            type = t;
            break;
        }
    }
}

 

장점

  • 사용이 간단함
  • 현재 로드된 Assembly를 바로 확인 가능
  • 일반 응용프로그램에서는 대부분 문제없이 동작

단점

  • 아직 로드되지 않은 DLL은 검색 대상이 아님
  • IIS 환경에서는 참조된 모든 Assembly가 로드되지 않을 수 있음

2. 웹 프로그램

ASP.NET 환경에서는 다음 메서드를 사용할 수 있습니다.

BuildManager.GetReferencedAssemblies()

public static ICollection GetReferencedAssemblies()

 

이 메서드는 웹 애플리케이션이 참조하고 있는 Assembly 목록을 반환합니다.

사용 예시

foreach (Assembly a in BuildManager.GetReferencedAssemblies().Cast<Assembly>())
{
    foreach (Type t in a.GetTypes())
    {
        if (t.Name == entityName.ToUpper())
        {
            apiType = t;
            break;
        }
    }
}

 

실제 경험

현재 운영 중인 환경은 IIS 위에 Service를 배포하여 사용하는 구조였습니다.

처음에는 AppDomain.CurrentDomain.GetAssemblies()를 사용했지만, 특정 DLL이 목록에 포함되지 않았습니다.

그 결과 Reflection으로 Entity 타입을 검색할 때 원하는 Type을 찾지 못했고, 이후 객체 생성 과정에서 Null Reference Exception이 발생했습니다.

문제를 분석해보니 해당 DLL이 실제로는 참조되어 있었지만 아직 AppDomain에 로드되지 않은 상태였습니다.

그래서 검색 방식을 다음과 같이 변경했습니다.

BuildManager.GetReferencedAssemblies()
변경 후에는 참조된 DLL들을 정상적으로 가져올 수 있었고, Entity 타입 검색도 문제없이 동작했습니다.

정리

구분 AppDomain.GetAssemblies() BuildManager.GetReferencedAssemblies()
사용 환경 일반 응용프로그램 ASP.NET 웹 애플리케이션
조회 대상 현재 로드된 Assembly 참조된 Assembly
IIS 환경 일부 DLL 누락 가능 대부분 정상 조회
추천 용도 Console / WinForms / WPF ASP.NET / IIS 서비스

결론

동적으로 Entity를 찾기 위해 Reflection을 사용할 때는 Assembly를 어떻게 수집하느냐가 매우 중요합니다.

  • 일반 응용프로그램이라면 AppDomain.CurrentDomain.GetAssemblies()
  • ASP.NET 또는 IIS 환경이라면 BuildManager.GetReferencedAssemblies()

를 사용하는 것이 안전합니다.

저의 경우 IIS에서 실행되는 서비스 환경에서는 AppDomain.GetAssemblies()로는 일부 DLL을 찾지 못했지만, BuildManager.GetReferencedAssemblies()로 변경한 후 정상적으로 Entity를 탐색할 수 있었습니다.

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

[C#] 인터넷 연결 체크 함수  (0) 2026.07.27
Prism Template Pack 소개  (0) 2026.07.22
[C#] WPF MVVM 메모장 만들기 강좌  (0) 2026.07.09
C# WPF MVVM이란? 유지보수가 쉬운 데스크톱 애플리케이션 개발 패턴  (0) 2026.07.08
[C#] WPF 기초 강좌 #3  (0) 2026.07.07
'Programming/C#.NET' 카테고리의 다른 글
  • [C#] 인터넷 연결 체크 함수
  • Prism Template Pack 소개
  • [C#] WPF MVVM 메모장 만들기 강좌
  • C# WPF MVVM이란? 유지보수가 쉬운 데스크톱 애플리케이션 개발 패턴
레이조(RayCho)
레이조(RayCho)
개발자 레이조(RayCho)의 블로그입니다. 똑똑하게 배우고 기록하는 공간
  • 레이조(RayCho)
    레이(Ray)의 개발이야기
    레이조(RayCho)
  • 전체
    오늘
    어제
    • 분류 전체보기 (101) N
      • Programming (101) N
        • Python (9)
        • Flutter (4)
        • Delphi (25)
        • Java,Spring Boot (2) N
        • Lazarus (2)
        • C#.NET (20)
        • ASP.NET (5)
        • Database (8)
        • Game Dev (6)
        • Rust (3)
        • PHP (3)
        • Web (6)
        • ETC (8)
  • 블로그 메뉴

    • 홈
    • Introduce
    • 태그
  • 링크

    • Naver Blog
    • Diary Blog
  • 공지사항

  • 인기 글

  • 태그

    WPF
    Python
    PSP
    개발환경
    프로그래밍
    델파이
    delphi
    소스코드
    ASP.NET
    Web
    iis
    csharp
    objectpascal
    기초
    Flutter
    C#
    VCL
    문법
    프로젝트
    mssql
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
레이조(RayCho)
C#에서 Dynamic하게 DLL의 Entity 타입 찾기 (AppDomain vs BuildManager)
상단으로

티스토리툴바