개발을 하다 보면 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()
정리
| 구분 | 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 |