관리 메뉴

KorSA

DLL이 경로에 있음에도 DLLNotFound Exception이 뜬다면.. 본문

Development Experience/C, C++

DLL이 경로에 있음에도 DLLNotFound Exception이 뜬다면..

Praiv. 2019. 11. 12. 17:43
320x100

C# 프로그램에서 C++로 작성된 DLL 파일을 로드하려했는데(DllImport) DllNotFoundException 오류가 발생하였다.

 

찾아보니 C#에서 C++ DLL을 로드하기 위해선

 

1. C#의 빌드 형식과 C++ DLL의 빌드 형식이 맞아야 한다. 즉, x86이면 x86끼리, x64면 x64끼리 로드해야 한다는 얘기.

2. 같은 경로에 있어야 한다.

3. 함수 호출 스택 (cdecl 인지, stdcall 인지) 이 맞아야 한다. 즉, C++ DLL의 호출 스택이 cdecl이면 C# 에서도 cdecl로, stdcall 이면 stdcall로 받아주어야 한다.

4. C++ DLL에서 extern "C"를 선언해야 한다.

 

위와 같은 조건이 맞아야 한다.

위의 4가지를 다 해봤는데도 안되었다...

 

그러다 찾은 원인은

C++ DLL이 참조하는 "또 다른" 파일들이 같은 경로에 존재하지 않아서였다.

즉 내가 로드하려는 C++ DLL 파일은 제대로 실행파일과 같은 경로에 위치하였는데, 이 C++ DLL이 참조하는 또 다른 파일들 (C++ DLL의 dependency가 있는 파일들) 은 같은 경로에 없었던 것이다.

필요한 파일들을 실행 경로로 복붙하니 잘 로드되었다.

 

이 C++ DLL은 내가 만든 DLL이어서 dependency가 걸려있는 파일들이 어떤 파일들인지 쉽게 알 수 있었다.

하지만 DLL이 내가 만든 파일이 아니라면 Dependency Maker 라는 프로그램으로 해당 DLL이 의존하고 있는 파일이 무엇이 있는지 직접 확인해야 한다. (극혐...ㅠ)

 

아래는 Dependency Walker 사용법에 관한 참고 사이트이다.

 

참고: Dependency Walker 다운로드> http://www.dependencywalker.com/

참고: Dependency Walker 사용법> https://notgivuphil.tistory.com/413

728x90
728x90
Comments