2009-04-12 5 views
1

私はC#を初めて使っています(先週学習を始めたばかりです)。C#でCの配列とポインタを使用するDLL

私は次の関数をCで書かれたカスタムDLL持っている:私が何を探しています何

DLLIMPORT void test_function (double **test) 

は、アレイ「試験」用のC#からポインタを持っています。

DLL関数では、test [0] = 450.60、test [1] = 512.99などです。私はC#プログラムで使用できるようにしたいと思います。私は次のように使用するDLLの 'test_function' 関数で

namespace TestUtil 
{ 
    public class Echo 
    { 
    public double[] results = new double[10]; 
    public double[] results_cpy = new double[10]; 


    [DllImport("test_dll.dll", CallingConvention = CallingConvention.Cdecl)] 
    static extern unsafe void test_function(ref double[] Result); 

    public unsafe void Tell() 
    { 
     results[0] = 0.0; 
     results[1] = 0.0; 

     results_cpy[0] = 0.0; 
     results_cpy[1] = 0.0; 

     test_function(ref results); 
     results_cpy[0] = (double)results[0] + (double)results[1] ; 
    } 
    } 
} 

::私はのようなものを持っているC#のプログラムで

*test[0] = 450.60; 
*test[1] = 512.99; 

DLLのすべてがOKだった中で(私が使用しました値が適用されていることを確認するDLL内のメッセージボックス)。 C#プログラムの '結果[0]'はうまく表示され、値を取得できますが、 'results [1]'は範囲外のインデックスを返します。私は '+(double)results [1]'を省略するとエラーは発生しないので、これを知っています。また、私がDLL内で 'test [1]'を修正しようとしないと、C#の元の値が保持されます(私の例では0.0)。

明らかに私は何か正しいことをしていませんが、これは私が仕事をしていることに最も近づいています。私が試した他のすべてが悲惨に失敗します。

ご協力いただければ幸いです。

答えて

1

私はあなたがすでにC++を知って推測しています。その場合は、C++からマネージコード(.NET)を簡単に使用できるC++/CLIを実際に見てください。あなたが上に示したコードは、C#のようなものではありません(あなたは完全にunsafeを避けるべきです)。

+0

+1は危険です。ほとんどの場合、より良い方法があります。 – Rap

0

類似の質問は、hereです。あなたは不透明なポインタを見ているので、他のスレッドで説明されているby-refシステムInPtrの可能性が高いです。

ところで、なぜダブル**の代わりにダブル*にしてください。それが人生を楽にしてくれると私は思う。

5

安全でないコードは必要ありません。実際、参照渡す必要は全くありません。あなたの署名は次のようになります場合:

void test_function (double *test) 

とインポートが次のようになります。

static extern void test_function(double[] Result); 

その後、すべてが正常に動作する必要があります。つまり、配列を変更するだけで完全に新しい配列を返す必要がないと仮定します。