2012-03-06 4 views
3

마침내 C++ DLL이 완료되었지만 C#에서 호출하는 데 문제가 있습니다. 그것은 확실히 'DLLNotFoundException'다른 예외를 얻을 폴더에서 제거 할 때 DLL을 찾는 것입니다. 전체 오류 설명은 "DLL 'CComms.dll'에서 'GetNewInstance'라는 항목 점을 찾을 수 없습니다." 기능은 모든 너무C#에서 관리되지 않는 함수를 호출 할 때 'System.EntryPointNotFoundException'이 발생했습니다.

__declspec(dllexport) DWORD __stdcall GetNewInstance(); 

처럼 ++ C에 수출하고 있습니다 내가 'DUMPBIN/수출 CComms.dll'나는 난 어떤 이상한 출력을 얻을 사용할 때 나는 그렇게

[DllImport("CComms.dll")] 
private static extern uint GetNewInstance(); 
// ... and in main 
uint inst = GetNewInstance(); 

같은 C 번호에서 호출 확실하지 않은 함수 이름은 엉망이되고 있으며이 진입 점 내가 대신 __stdcall의 __cdecl 사용하려고했습니다

7 6 00002FB0 [email protected]@YGKXZ = [email protected]@YGKXZ (unsigned long 
__stdcall GetNewInstance(void)) 

를 찾을 수 없습니다 이유, 그리고 같은 결과를 가지고 있는지. 나는이 프로젝트를 끝내기에 너무 가깝다. 나는 그 모든 것을 끝내기를 바란다. 희망적으로 이것이 내 방식의 마지막 것이다.

감사합니다.

+1

해결 나는 너를 본다. ntion "CComms.dll"하지만 DllImport 특성은 "VLTGLSCommsDLL.dll"을 찾는 것 같습니다. 그게 잘못된 것인가? – Ani

+1

"이 함수는 모두 C++에서 내보내집니다."수출 선언에'extern "C"'를 추가하여 일반적인'__stdcall' 내보내기 이름을 얻을 수 있습니까? .NET이 두 가지 유형을 모두 가져올 수 없다면 놀랄 것입니다. – Rup

+0

죄송합니다. 수출 된 모든 함수가 extern "C"블록으로 싸여 있다고 설명 했어야합니다. 여기서는 함수 중 하나를 예제로 보여 주었고, DLL 이름에 대해서는 최근에 변경 한 것뿐입니다. 이것을 입력 할 때 이전과 새로운 DLL이 섞여서 올바른 DLL을 찾고 DLL을 찾았습니다. 그렇지 않으면 DLLNotFoundException이 발생합니다. 모든 곳에서 올바른 DLL 이름을 갖도록 코드를 변경했습니다. –

답변

0

두 가지 방법으로 DLL을 만들 수 있습니다.

하나는 함수의 주소를 가져 오는 것 (oldschool 방식)이고 두 번째는 매개 변수와 이름 (예 : .net에서 사용하는 "새로운"방법)입니다.

나는 VB와 같은 문제를 가지고 당신 ++ 어쩌면 당신은 여기 GetProcAddress Msdn

GetProcAddress 유용

0

에 올 수도 Dll exportation에 관한 몇 가지 문서입니다 사용해야 dll을 제대로

당신의 C를 사용하지 않는 상상 .NE __stdcall없이 함수가 선언되었지만 Managed Debugging Assistant 'PInvokeStackImbalance'경고가있는 경우이 예외가 발생하지 않았습니다. 라이브러리 함수에

extern "C" _declspec(dllexport) 
int __stdcall GetLine(HWND hwnd, int iLine, TCHAR *buff) 
dll을 프로젝트

Adde의 exports.def 파일

EXPORT 
    GetLine 

및 링커에

를 선언 추가 옵션

/DEF:"exports.def" 

이 문제는

관련 문제