-1

次の c#/c コードがあり、C dll で処理を行っています。ピンボーク/マーシャルを黒魔術として使用して、DLL 内のものを動的に割り当て/解放できるようにしています。

このスニペットでは、double の配列を割り当て/使用/解放するために 2 つの異なる方法を使用していることがわかります。私の質問は、両方の呪文 (つまり、MarshalAs ステートメントを使用するかどうか) が正常に機能するため、「MarshalAs(UnmanagedType...」行は何をするのかということです?私は C の理解が不十分であり、さらに理解していないことを付け加える必要があります。私はC#のすべてを理解し、超対称量子力学を理解するだけでなく、ピンボーク/マーシャル全体を理解しています。

 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public class row
    {
            public int a;

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
            IntPtr[] b;

           IntPtr [] c; 
    } 

    // c code
struct row
{
    int a;
    double *b;
    double *c;
}

void fooe(void)
{
      row.b[4] = (double *) malloc(54000);
      row.c[4] = (double *) malloc(54000);
      free(row.b[4]);
      free(row.c[4]);
}
4

1 に答える 1

-1

のこの特定の使用は、すべてをByValArray変更します。

まず、なしのByValArray場合を考えてみましょう。ここで、配列は最初の要素へのポインターとしてマーシャリングされます。一致する C 構造体は

struct row
{
    int a;
    void* *b; // more likely you would use a typed pointer
    void* *c;
}

を使用する場合はありませんByValArray。ここで、配列はインラインでマーシャリングされ、同等の C 構造体は次のとおりです。

struct row
{
    int a;
    void* b[12];
    void* *c;
}

これら 2 つのバージョンは大きく異なります。

また、本当にIntPtr[]C# コードで使用するつもりだったのかも疑問です。もしかして本当に書くつもりだったのdouble[]?したがって、おそらくあなたは実際に次のことを意味していました:

[StructLayout(LayoutKind.Sequential)]
public class row
{
    public int a;
    double[] b;
    double[] c; 
} 

その場合、一致する C 構造体は次のようになります。

struct row
{
    int a;
    double *b;
    double *c;
}

関数の意味はわかりfooeませんが、まったく意味がなく、コンパイルされません。まったく意味のない double にポインタを代入しようとしているようです。

于 2013-09-05T06:29:58.157 に答える