System.EntryPointNotFoundException 예외는 C#에서 DllImport로 호출하려는 함수의 "진입점(entry point)"—즉, DLL 안에 해당 함수 이름으로 내보낸(exported) 심볼이 존재하지 않을 때 발생합니다. 이건 네이티브 DLL과 C# 선언이 정확히 일치하지 않을 경우 흔히 생기는 오류예요.
🔍 원인 분석: 왜 진입점을 못 찾을까?
원인설명
❌ DLL에 함수가 Export되지 않음 | __declspec(dllexport) 없이 빌드됐거나, MFC 함수가 자체적으로 숨겨져 있음 |
🧨 함수 이름이 맹글링(mangling) 됨 | C++에서는 함수 이름에 인자 정보가 포함되어 이름이 변경됨 (C#에서는 찾지 못함) |
🔀 함수 이름을 잘못 썼음 | DllImport에서 함수 이름 오타 또는 대소문자 차이 |
🏷️ DLL 파일 이름이나 경로 오류 | 잘못된 DLL 이름, 위치 또는 잘못된 플랫폼(x86/x64) |
🧰 CallingConvention 불일치 | __stdcall ↔ __cdecl 등 호출 규약이 다르면 찾지 못함 |
✅ 해결 방법
1. C++ 함수에 extern "C" 추가
cpp
extern "C" __declspec(dllexport) void MyFunction();
- extern "C"는 C++의 이름 맹글링을 방지하여 심볼을 정확히 내보내게 합니다.
- MFC는 자동으로 이름을 맹글링하므로 꼭 써줘야 해요!
2. DLL에 함수가 실제로 있는지 확인
- 🔧 Dependency Walker 또는 [🛠️ dumpbin /exports] 명령어로 DLL을 열어 함수가 있는지 확인
- 만약 ?MyFunction@@YAXXZ 같은 이상한 이름으로 보인다면, extern "C" 누락된 거예요.
3. C# DllImport 정의 수정
csharp
[DllImport("MyMfcDll.dll", EntryPoint = "MyFunction", CallingConvention = CallingConvention.Cdecl)]
public static extern void MyFunction();
- EntryPoint는 DLL의 내보낸 정확한 함수 이름이어야 해요 (맹글링 안 됐을 경우)
- CallingConvention은 C++ 선언과 일치해야 하고, MFC는 대개 Cdecl 씁니다.
4. MFC DLL이 제대로 빌드되었는지 확인
- .def 파일로 Export 목록을 직접 지정할 수도 있음
- C++ 함수가 AFX_EXT_CLASS 등 MFC 매크로로 감싸져 있으면 자동 Export가 안 되기도 해요
dumpbin 사용법
dumpbin은 Visual Studio에 포함된 도구로, Windows DLL이나 EXE 파일의 내부 구조를 분석할 때 사용돼요. 특히 함수가 제대로 export 되었는지 확인할 때 유용하죠. C#에서 DllImport 시 EntryPointNotFoundException이 발생하면 dumpbin을 통해 DLL 안에 함수가 실제로 있는지 확인하는 것이 핵심입니다.
🛠 dumpbin으로 DLL 함수 확인하는 방법
1. Visual Studio 개발자 명령 프롬프트 열기
- 시작 메뉴 → "x64 Native Tools Command Prompt for VS 2022" (또는 사용하는 VS 버전에 맞는 도구 선택)
2. 명령어 실행 예시
bash
dumpbin /exports YourDll.dll
- /exports 옵션은 DLL이 외부로 내보내는 함수 목록을 보여줍니다.
- YourDll.dll은 확인하려는 DLL 경로 또는 이름이에요.
📌 DLL 경로가 현재 디렉터리에 없으면 전체 경로로 지정하거나 먼저 해당 폴더로 cd 이동하세요.
3. 출력 확인
예시 출력 일부:
ordinal hint RVA name
1 0 00011000 MyFunction
2 1 00012000 ?CppFunction@@YAXH@Z
- MyFunction처럼 심플한 이름은 extern "C"가 적용된 함수
- ?CppFunction@@... 같은 경우는 C++의 이름 맹글링(Mangled)된 함수
LIST
'.NET' 카테고리의 다른 글
C# float string format 전체 길이와 소수점 자리수 제어 (2) | 2025.07.28 |
---|---|
C# Throw 발생 방법 (0) | 2025.05.13 |
C# 폴더 내부 파일을 다른 폴더로 복사 (0) | 2025.05.13 |
C# Random 함수 사용 (1) | 2025.05.13 |
C# 선택한 폴더 안의 파일 및 폴더 삭제 방법 (0) | 2025.05.13 |