2016-03-23 9 views
0

ネイティブC++ DLLをC#DLLにマーシャリングしています。私はC/C++であまり認知されていませんが、私はこの問題に執着するまで動作させることができました。ここでは非常に単純なコードの例です:C#P/Invoke:ネイティブ出力パラメータ値がマネージコードに到達しない

C++

PROASADLL __declspec(dllexport) void outTest(int* number){ 
    int temp = *number + 10; 
    number = &temp; //*number = 12 
} 

C#

[DllImport("ProAsaNativeDll.dll", CallingConvention = CallingConvention.Cdecl)] 
private static extern void outTest(ref int number); 

public static int OutTest() 
{ 
    int number = 2; 
    outTest(ref number); 
    return number; //number = 2 
} 

私は私の本当のシナリオだと注意してください、私はこれはへのポインタで動作するように取得しようとしています構造体へのポインタですが、マーシャリングの問題ではないので、私はそれを残すことにしました。この単純なコードでさえも機能しません。 C++のコードは動作しますが、私は愚かでありそこに問題があることを排除することはありません。私が言ったように、C/C++はあまり知られていません。

C#ラッパーメソッドの数値変数の値は変更されません。助けてください。

+2

悪いC++コードです。あなたがそれをピンボケしたとき、それは決して良くなりません。最初にC++テストプログラムから動作させる。 –

答えて

2

あなたのC++コードでは、実際にパラメータnumberを別のポインタに設定しているため、結果が悪いと思います。

私はあなたの変更があなたの機能outTestのスコープにしか見えないと信じています。

ただし、ポインター...のポイントの値を変更すると、別のストーリーになるはずです。このような感じです。

*number = *number + 10; 

EDIT:このビットはテストされていません。ああ...そしてまた...私は何年もの間、C++で何も書いていません。完全に間違っているかもしれません。

+0

自転車に乗るのが好き – Jacobr365

+1

@ Jacobr365ええ...すべてがうまくてきれいです...あなたが倒れて鼻を曲げるまで: –

+0

ニース!私が言ったように、C++は自分の強みではありませんが、私はあなたが行ったことと私が間違っていた場所の両方を見ています。どうもありがとう! – makoshichi

関連する問題