2011-12-01 2 views
0

나는 다음과 같은 C++ 기능 및 C# p를/decleration 호출 한 :P/호출 불균형 스택 오류

//C# 
[DllImport("capture.dll", EntryPoint = "setup")] 
public static extern void captureSetup(int rr); 

//C++ 
extern "C" { 
    __declspec(dllexport) void setup(int rr) 

을하지만 가능성이 관리 서명이 일치하지 않음으로써 발생 AP/호출 불균형 스택에 대한 오류를 얻고있다 관리되지 않는 서명.

누구나이 문제가 무엇인지 볼 수 있습니까?

+0

'setup'이 (는) C 호출 규칙을 사용합니까? –

+0

@EricJ. 예. 이것은 'int'매개 변수를 추가하기 전에는 문제가 없습니다. – baruch

+0

C# 선언은 Short가 아니어야합니까? –

답변

6

호출 규칙이 일치하지 않습니다. C++ 코드는 기본적으로 cdecl을 사용하지만 C#은 stdcall으로 가정합니다. 일치하도록 설정해야합니다 (예 :

[DllImport("capture.dll", EntryPoint = "setup", 
    CallingConvention = CallingConvention.Cdecl)] 
public static extern void captureSetup(int rr); 
+0

위대한 작품입니다 (3 분 안에 받아 들일 수 있습니다). 그러나 설치 프로그램에 매개 변수가 없는데 왜 제대로 작동 했습니까? – baruch

+0

cdecl에서 호출자가 스택을 정리합니다. stdcall에서 호출 수신자가 스택을 정리합니다. 매개 변수가 없으면 아무도 정리할 필요가 없으며 디버그 도우미는 잠재적 인 불일치가 있음을 알 수 없습니다. –

+0

그런데 또 다른 대답이있었습니다. 삭제 된 것은 아니며 int의 크기를 설명했습니다. 하나의 윈도우,'int'는 C++과 C# 모두 32 비트입니다. 거기에 문제 없습니다. –