ref 呼び出しを介して参照でき、変更できないメモリ内の場所に構造体を書き込むにはどうすればよいですか。
dll と通信するためのポインターが必要で、値が変更されているため、ref を渡してきました。ref を渡さないと、「保護されたメモリの読み取りまたは書き込みを試みました」というエラーがスローされます。
考え?
ref で渡す前に複製します。明らかに、構造体へのポインターをアンマネージ コードに渡す場合、その場所でメモリの読み取り専用プロパティを強制する方法はありません。これは構造体なので、次のように簡単にできます。
これがあれば、
private struct DataType
{
public int X;
public int Y;
}
private class NativeMethods
{
[DllImport("MyDll")]
public static extern void SomeMethod(ref DataType value);
}
次に、前の呼び出しは次のようになります。
DataType data = ...;
NativeMethods.SomeMethod(ref data);
そして、後の呼び出しは次のようになります。
DataType data = ...;
DataType temp = data;
NativeMethods.SomeMethod(ref temp);
私の理解が正しければ、単に InAttribute を指定し、マーシャラーに、C# からネイティブへ、後方ではなく 1 回だけマーシャリングする必要があることを伝える必要があります。
[DllImport("somedll")]
public static extern void SomeMethod(
[In] ref SomeDataStruct value);