2009-08-24 4 views
0

정적 라이브러리에서 함수를 노출하는 간단한 C DLL이 있습니다. DLL이 오류없이 컴파일되고 DUMPBIN을 실행하여 내보내기를 볼 수 있습니다. 그러나, 나는 C#에서 DllImport으로로드 할 때,이 말한다 :cl.exe가 올바른 Windows 모듈을 생성하지 않는 이유는 무엇입니까?

System.DllNotFoundException: Unable to load DLL 'ei.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E).

그것은 확실히 올바른 디렉토리에 있습니다. 그래서, 내가 다른 것을 포함시킬 필요가있을 때를 대비하여 Dependency Walker를 시도하는 것이 좋은 생각 일 것이라고 읽었습니다. 내가 DW 내 DLL을 열려고하면 불행하게도,이 얻을 :

Error: At least one file was not a 32-bit or 64-bit Windows module.

을 여기 내 cl 명령입니다 :이 원인이 될 수 무엇

set ERL_INTERFACE_DIR=C:\Progra~1\erl5.7.2\lib\erl_interface-3.6.2\ 
call vcvars32.bat 
cl /I%ERL_INTERFACE_DIR%include /LD ei.c ei.lib Ws2_32.lib /link /LIBPATH:%ERL_INTERFACE_DIR%lib 

?

+0

종속성 워커의 출력 (모듈 목록)을보다 잘 보여줍니다. – EFraim

+0

EI.DLL <- 그게 유일한 것입니다. 그 옆에 빨간색 원이 있습니다. –

답변

0

컴파일러가 내보내는 LIB 파일과 이름이 같은 LIB 파일로 연결 했으므로 자체와 연결되었습니다. 방금 내 소스 파일의 이름을 ErlInterface.c로 변경했습니다. 나는 링커가 이런 일이 발생할 때 경고 나 무언가를 던질 것이라고 생각하지만 그렇지 않습니다.

어쨌든 종속성 워커에서 DLL을 열 수 있지만 여전히 DllImport과 함께 사용할 수 없습니다. 그것은 또 다른 질문입니다.