1

私はC#を初めて使用します(先週学習を開始したばかりです)。

次の関数を使用してCで記述されたカスタムDLLがあります。

DLLIMPORT void test_function (double **test)

私が探しているのは、配列'test'用のC#からのポインターを用意することです。

したがって、DLL関数でtest [0] = 450.60、test [1] = 512.99などがある場合、C#プログラムでそれを使用できるようにしたいと思います。

C#プログラムでは、次のようなものがあります。

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] ;
    }
  }
}

DLLの「test_function」関数では、次のものを使用しました。

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

Within the DLL everything was OK (I used a message box within the DLL to check the values were being applied). Back in the C# program 'results[0]' appears to be fine and I can get values from it, but 'results[1]' gives me an index out of bounds error. I know this because if I omit '+ (double)results[1]' I receive no error. Also, if I make no attempt within the DLL to modify 'test[1]' it retains the original value from C# (in my example 0.0).

Obviously I am not doing something right but this is the closest I have been able to get to having it work at all. Everything else I have tried fails miserably.

Any help would be greatly appreciated.

4

3 に答える 3

5

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

void test_function (double *test)

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

static extern void test_function(double[] Result);

その後、すべてが正常に機能するはずです。つまり、配列を変更するだけでよく、まったく新しい配列を返さないと仮定します。

于 2009-04-12T03:34:37.183 に答える
1

あなたはすでに C++ を知っていると思います。その場合は、C++ からマネージ コード (.NET) を簡単に使用できる C++/CLI を検討する必要があります。上記のコードは、実際にはあまり C# に似ていません (完全に避ける必要がありますunsafe)。

于 2009-04-12T03:11:56.223 に答える
0

SO hereに関する同様の質問。不透明なポインターを見ているので、他のスレッドで説明されているように、参照システム InPtr である可能性があります。

ところで、double** の代わりに double* にしてみませんか。そうすれば、人生が楽になると思います。

于 2009-04-12T03:33:13.067 に答える