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
'Development Experience > C, C++' 카테고리의 다른 글
HeapAlloc, LocalAlloc, GlobalAlloc 차이 (0) | 2020.11.25 |
---|---|
C++ Heap corruption 원인 (0) | 2020.04.08 |
C++ <-> C# 간 마샬링 시 메모리 할당 및 해제 (0) | 2019.10.14 |
Error Message: 식에 정수 또는 범위가 지정되지 않은 열거형 형식이 있어야 합니다 (2) | 2019.10.03 |
C# 과 C++ 간 마샬링시 Heap Corruption 오류에 관하여 (0) | 2019.09.18 |