私は次のように定義される「C」のstruct持っている:私は、この関数にPInvokeのにstructに整数の配列が含まれている場合、PInvokeマーシャリング時のコピーを避けるにはどうすればよいですか?
void FillTest(tUI8 Mode, TestStruct *s);
:
typedef unsigned char tUI8;
typedef struct
{
tUI8 Mode;
tUI8 Data[16];
} TestStruct;
そして、この構造体へのポインタを受け取り、データを埋める機能をこれは動作しますが、私はのPInvokeマーシャラー中に通話中に構造体をコピーしているし、それを固定するのではなく返すことが疑われる
[StructLayout(LayoutKind.Sequential)]
struct TestStruct
{
public byte Mode;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] Data;
}
static class NativeTest
{
[DllImport("Native.dll")]
public static extern void FillTest(byte mode, ref TestStruct s);
}
:としてC#コードを書きました。構造体を初期化しなくてもうまく動作するからです。
TestStruct s;
//here s.Data == null!
NativeTest.FillTest(10, ref s); //<<< I expected an error here
//here s.Data points to a valid byte[] of length 16
Console.WriteLine(BitConverter.ToString(s.Data));
私の質問は、マーシャリング時にデータをコピー避けた、私は構造体やクラスのいずれかを使用して、のPInvokeシグネチャを定義する方法ですか?
注意として、マーシャリングすることで
、およびプロジェクトのプロパティで、安全でないコードを許可するチェック。 – linquize
うん。私はそれを試して、それは動作しますが、私は(安全ではないとマークして)私が悪い人であることを何度も宣言しなければなりませんでした。私はまた、呼び出し中にmarshallerが自動的に構造体を固定するかどうか、または明示的にそれを行う必要があるかどうかについてはわかりません。 – Hemant
@Hemantコピーを避けたい場合は、安全でないものを使用する必要があります。安全でないことを避けたい場合は、マーシャラーのコピーを許可する必要があります。データをコピーするのはどうですか? –