0

アンマネージ コードで使用する構造体の配列を指す IntPtr を割り当てます。このテーマに関する多くのリソースを見つけました。これが私の最終的な方法です(うまくいくようです):

public IntPtr ArrayToPtr<T>(T[] array)
{
    int size = array.Length;
    int elemSize = Marshal.SizeOf(typeof(T));

    IntPtr result = Marshal.AllocHGlobal(elemSize * size);

    for (int i = 0; i < size; i++)
    {
        IntPtr ptr = new IntPtr(result.ToInt64() + elemSize * i);
        Marshal.StructureToPtr(array[i], ptr, false);
    }

    return result;
}

今私の質問:

  • この結果の IntPtr ポインターを適切に解放するにはどうすればよいですか? (FreeHGlobal(ポインタ)で十分ですか?)
  • x86 または x64 システム/アプリケーション プラットフォームを使用する場合に注意すべきことはありますか?

文字列の配列 (C の char**) に対する同じ質問:

public IntPtr ArrayOfStringToPtr(string[] array)
{
    int size = array.Length;
    int elemSize = IntPtr.Size;

    IntPtr result = Marshal.AllocHGlobal(elemSize * size);

    for (int i = 0; i < size; i++)
    {
        IntPtr strPtr = Marshal.StringToHGlobalAnsi(array[i]);
        Marshal.StructureToPtr(strPtr, new IntPtr(result.ToInt64() + elemSize * i), false);
    }

    return result;
}
4

1 に答える 1