2010-12-01 1 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出力の輸出を見ることができます:

マイ輸出方法は次のようになります。

さて問題は、管理 のPInvokeシグネチャが一致しないため、

これは可能性があることを私に言って、私はいつもPInvokeStackInbalance例外を取得するので、私は私の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); 

...。問題が何であるか誰にも手掛かりがありますか?

ありがとうございます!

+0

C#コードから「C++クラス」を呼び出すことはできません。しかし、それは1のように見えません。 –

+0

'ref double'または' out double'はパラメータを宣言する正しい方法です - 助けがあれば 'unsafe'を使い始めないでください –

+0

Hans:extern関数はクラスではありませんが、 。私はちょうど外部からの呼び出しをより簡単にするための単純なfunctoinを行いました。 – Shtong

答えて

3

あなたはPである、__stdcallとしてあなたの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