は、私はバイト配列から構造体を取得することを目的といくつかのコードがあります。Marshal.Copy()を使用して構造体を更新できないのはなぜですか?
public static T GetValue<T>(byte[] data, int start) where T : struct
{
T d = default(T);
int elementsize = Marshal.SizeOf(typeof(T));
GCHandle sh = GCHandle.Alloc(d, GCHandleType.Pinned);
Marshal.Copy(data, start, sh.AddrOfPinnedObject(), elementsize);
sh.Free();
return d;
}
をしかし、構造d
は変更されることはありませんし、常にそのデフォルト値を返します。
私はこれを行うには正しい方法を探していますが、その代わりにそれを使用していますが、それでもうまくいかない理由はわかりません。
そのように簡単です:いくつかのメモリを割り当て、d、ポインタを取得し、これによってポイントされるメモリにいくつかのバイトをコピーします。 それだけでなく、でも同様のコードを使用していますが、dがTの配列であるとうまくいきます。 sh.AddrOfPinnedObject()が実際にd
を指していない限り、そのポイントは何ですか?
誰でも私が上記の理由で動作しない理由を教えてもらえますか?
「正しい」方法は何だったのですか? – Dmitry
@Dmitry、こんにちは、PtrToStructure()を使用して、構造体の内容を含むアンマネージメモリへのポインタを渡す方法があります。http://msdn.microsoft.com/en-us/library/4ca6d5z7.aspx リフレクターを使用すると、PtrToStructure()は新しいオブジェクトをインスタンス化し、それを挿入しますが、それは私が見ることができないCLRにあると考えられるため、確信が持てません(http://stackoverflow.com/questions/11788625/pinvoke-win32-function-for-marshal-ptrtostructure-in-silverlight-5) – sebf