배경
최근 회사에서 여러 제품에서 공통으로 참조해서 사용하기 위해서 유틸리성의 공용 다이얼로그 프로젝트를 만들었다. 별도의 프로젝트로 테스트코드까지 작성하여 완성시킨 뒤, 현재 제품에 적용하는 중에 FileNotFoundException가 발생하였다. 회사에서 업무를 진행하다가 종종 발생하는 Exception이나 그 동안 해결 방법을 기록해두지 않아 10~20분을 구글링을 하게 되었다. 다음에 같은 상황이 발생했을 때 해결 시간을 1~2분으로 축소하기 위해 이렇게 기록해두려 한다.
원인

회사내의 프로젝트간 참조 구조는 간단하게 위와 같이 나타낼 수 있다. ProjectA는 솔루션의 메인 프로젝트로서 실질적인 프로그램의 실행을 담당한다. ProjectB의 경우는 ProjectA에서 호출할 프로그램의 기능들이 개발되어있다. 특별한 점은 해당 프로젝트는 Plugin 형식의 프로젝트로써 런타임에 로드된다는 점이다. ProjectC의 경우는 이번에 공용 다이얼로그를 개발한 프로젝트이다.
- ProjectA : 메인 프로젝트
- ProjectB : 프로그램의 세부 기능 구현
- ProjectC : 공용 다이얼로그
해당 Exception이 발생하였을 때, 두 가지 원인을 추측했다.
참조할 프로젝트의 참조 목록
먼저, ProjectC에서 참조한 Nuget 패키지나 어셈블리 참조 목록의 어떤 요소가 ProjectA에서 로드할 수 없는 상황을 예상했다. 그래서 모든 프로젝트의 csproj 파일을 열어 참조 항목의 요소와 버전을 모두 육안으로 비교했다. 하지만 별다른 차이점을 찾지 못했다.
실행 위치에서의 dll 생성 여부
실질적으로 프로그램이 실행되는 메인 프로젝트의 bin 폴더를 살펴보았다. 프로젝트가 모두 빌드되었으나 해당 폴더에는 ProjectC에서 생성된 dll 파일과 pdb 파일이 존재하지 않았다.
두 단계로 확인해본 결과 실행파일과 동일 위치의 폴더에 ProjectC의 dll 파일이 없어 런타임 시점에서 오류가 발생하는 것이었다.
해결
ProjectB의 경우는 Plugin 모듈로써 메인 모듈 중의 하나인 ProjectC를 참조한다. 따라서 ProjectB가 빌드되는 위치에 ProjectC dll 파일의 복사는 정상적으로 이루어지고 있었으나, ProjectA가 ProjectB dll 파일을 읽어 Plugin 형식으로 로드하는 시점에 ProjectC가 누락되는 현상이었다.
해결은 간단했다. ProjectA 실행파일과 동일한 위치에 ProjectC의 dll이 생성되도록 설정해주면 해결이 되었다. 필자의 경우는 ProjectC가 ProjectA에서도 자유롭게 사용되도 무관했기 때문에 ProjectA에 ProjectC에 대한 참조를 추가해주었다. 이렇게함으로써 ProjectA가 빌드될 때, ProjectC dll 파일이 해당 위치에 생성되는 것을 확인할 수 있었다. 물론 기능도 정상적으로 작동하였다.
'Software Develop > 문제해결' 카테고리의 다른 글
[C#] DataGrid로 DataTable 출력시 일부 cell이 없어지는 경우 (0) | 2023.01.30 |
---|---|
[JavaScript] CORS (Cross Origin Resource Sharing) 에러 (0) | 2023.01.06 |
[VisualStudio] Visual Studio 중단점 (Break Point) (0) | 2022.11.01 |