2010-12-01 3 views
0

P/Invoke 호출에 문제가 있습니다. C# 프로그램에서 C++ 클래스를 호출해야합니다. 이 클래스의 소스를 가지고 있으므로 DLL 프로젝트에 넣고 주요 함수에 액세스하는 내보내기 함수를 만듭니다. 그게 내가해야 할 일을하고 일을 간단하게하기에 충분할거야.P/Invoke로 이중 매개 변수를 마샬링

extern "C" _declspec(dllexport) void Inference(double *c1, double *c2, double *c3, double *result) 
{ 
    /* somecode */ 
} 

이 컴파일하고 나는 dumpbin 출력의 수출을 볼 수

내 수출 방법은 다음과 같습니다.

이제 문제는 내가 항상 PInvokeStackInbalance 예외가 때문에 관리 의 PInvoke 서명이 일치하지 않기 때문에

이 가능성이 높다고 말해, 내 C# 코드에서이 메소드를 호출 할 수 없다 관리되지 않는 대상 서명입니다.

나는이와 메서드를 호출 시도 :

[DllImport("InferenceEngine.dll")] 
extern static unsafe void Inference(double *c1, double *c2, double *c3, double *result); 

가 나는 또한이 시도 : MSDN에하지만 행운과 문서화 두 가지 방법이었다

[DllImport("InferenceEngine.dll")] 
extern static void Inference(ref double c1, ref double c2, ref double c3, ref double result); 

.... 문제가 무엇인지 아무도 모른다.

감사합니다. 는 P입니다 __stdcall

+0

C# 코드에서 'C++ 클래스'를 호출 할 수 없습니다. 그것은 하나처럼 보이지 않습니다. –

+0

'ref double' 또는'out double'은 매개 변수를 선언하는 올바른 방법입니다 - 도움이된다면'unsafe'를 사용하지 마십시오 –

+0

Hans : extern 함수는 클래스는 아니지만 클래스를 실제로 호출합니다 . 방금 외부에서 전화를 걸기 위해 간단한 functoin을했습니다. – Shtong

답변

3
당신은 당신의 C를 선언해야

++ 기능/호출 기본 :

extern "C" _declspec(dllexport) void __stdcall Inference(double *c1, double *c2, double *c3, double *result); 

이 호출/선언 혼자 C++ 프로토 타입을두고 P를 변경할 수도 있습니다

[DllImport("InferenceEngine.dll", CallingConvention=CallingConvention.Cdecl)] 

cdecl은 Windows API가 stdcall이기 때문에 P/Invoke와 함께 자주 사용되지 않습니다.

+0

또는 [DllImport] 특성에서 CallingConvention를 사용하십시오. Cdecl을 사용하십시오. –

+0

@ 한스, 나보다 앞서 한 발자국이야. –

+0

고마워, 그랬어 :) – Shtong