programing/C#

[C#] 32bit dll 사용 시 "...호출 결과 스택이 불안정하게 되었습니다." 에러

쪽제비 2017. 3. 20. 16:17

C++ 64bit Dll 을 만들어서 C# 에서 사용하고 있었다...

그런데... 문제가 발생했다. 사용해야 할 PC가 Stick PC 로 바뀌면서 32bit로 변환해주어야 하는 상황이 발생한 것..


dll을 32bit로 컴파일해서 넣으면 끝나는 줄 알았다.

그렇게 쉬운게 아니었다. 에러는 계속 나고.. 해결은 안되고..


다른 에러들은 쉽게 해결했지만 마지막 에러가 오래 걸렸다.


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


이런 에러인데.. Invoke라 길래 동기화인줄 알고 동기화 처리 하다가 에러를 그대로 구글에 입력하니까 해결방법이 나왔다.


출처 : http://freyya.tistory.com/131


설명이 잘되어 있는 곳이 있었지만.. 도통 무슨말인지 모르겠고 시간도 없기에 그냥 해결방법만 간단히 나온 출처를 남긴다.


이전에 정리 했듯이 C#에서 DLL 함수를 사용하기 위해서는 DllImport 를 해야 하는데


[DllImport("DLL파일명")]

함수();


이런 식이으로 하면 되었지만 위의 에러가 발생할 경우에는 호출방법을 정의해 주어야 한다.


해결


[DllImport("DLL파일명", CallingConvention = CallingConvention.Cdecl))]

함수();





간단한가... 그래도 왜 저렇게 써야하는지는 나도 이해가 안되므로 나중에 기회가 된다면 정리하자.