C# 으로 외부 SDK를 DllImport해서 사용하는 도중에 아래와 같은 런타임 에러가 발생했다.

 

 

"CreateSceneInstance'에 대한 호출 결과 스택이 불안정하게 되었습니다. 관리되는 PInvoke 시그니처와 관리되지 않는 대상 시그니처가 일치하지 않기 때문인 것 같습니다. 호출 규칙 및 PInvoke 시그니처의 매개 변수와 관리되지 않는 대상 시그니처가 일치하는지 확인하십시오."

 

라는 런타임 에러인데... SDK가 외국 회사 SDK라서 물어보기도 애매한데 에러가 나서 당황했지만, SDK에 포함되어 있는 샘플 프로그램과 하나하나 비교해보니 샘플 프로그램은 닷넷 2.0으로, 내가 짜는 프로그램은 닷넷 4.0을 기준으로 설정되어 있는 것을 확인 했다.

 

그래서 내가 만든 프로젝트도 닷넷 2.0으로 설정을 바꾸니 이 에러 없이 정상 동작 한다.. ㅎㅎ

 

 

 

인터넷에서 검색을 해봐도 이 에러가 발생했을 때, 닷넷 프레임 워크 3.5이하 버전으로 대상 프레임 워크를 변경하면 된다는 답변이 있었다.. 그래도 뭔가 이렇게 끝내려고 하니 안 닦고 나온 기분이라 좀더 검색을 해봤는데, 이 문제의 원인은 DLL파일을 Import할 때 함수 호출규약 CallingConvention을 DLL파일과 동일하게 설정해 주지 않았기 때문이란다.

 

닷넷 4.0부터는 DllImport할 때 CallingConvention을 지정하지 않는 경우 무조건 __stdcall로 간주하고 함수를 가져오는데, 이 때문에 dll에 들어 있는 함수와 실제 부르려고 하는 함수간 호출규약이 다르면 이런 에러가 날 수 있다고 한다.

 

이제 함수를 부를 때 아래와 같이 실제 CallingConvenction을 명기해주면, 정상적으로 런타임 에러 없이 프로그램이 동작한다.

 

출처 : 다음 블로그 어딘가 impactlife라는 분이 남기신 댓글에서 이 정보를 얻었다. 2013년에 올리신 답변이 2015년에

         어떤 초보 개발자를 구했다. 감사하다는 말을 남긴다.

 

Posted by 굿쟌
,