は構造体ですが、私は、呼び出し側が同様の方法にnull
(またはIntPtr.Zero
)を通過できるようにする必要があります。構造体にIntPtrを取得するには?私は署名</p> <pre><code>public int Copy(Texture texture, Rect? srcrect, Rect? dstrect) </code></pre> <p><code>Rect</code>と方法を持っている
[DllImport("SDL2.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_RenderCopy")]
internal static extern int RenderCopy(IntPtr renderer, IntPtr texture, IntPtr srcrect, IntPtr dstrect);
でDLLにそれを渡したい
:
return SDL.RenderCopy(_ptr, texture._ptr, srcrect.HasValue ? (IntPtr)srcrect.Value : IntPtr.Zero, dstrect.HasValue ? (IntPtr)dstrect.Value : IntPtr.Zero);
をしかし、私は構造体をキャストすることはできませんそうですね。それ以外の方法で私はIntPtr
を得ることができますか?得ることができる
ref Rect, ref Rect
IntPtr, IntPtr
ref Rect, IntPtr
IntPtr, ref Rect
:
あり、代替は4つのオーバーロードを作成することです2つ以上の構造体ポインタを渡す必要がある場合は、もっと面倒です。
私は解決策を考え出したが、私はそれについていくつか質問がある:
public int Copy(Texture texture, Rect? srcrect=null, Rect? dstrect=null)
{
return SDL.RenderCopy(_ptr, texture._ptr, srcrect.HasValue ? StructToPtr(srcrect) : IntPtr.Zero, dstrect.HasValue ? StructToPtr(dstrect) : IntPtr.Zero);
}
private static IntPtr StructToPtr(object obj)
{
var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(obj));
Marshal.StructureToPtr(obj, ptr, false);
return ptr;
}
は、私は構造体にメモリを割り当てるために持っていないでしょうref Rect
を使用していた - ことを何をしますかこれとは違ったやり方はありますか?
私はいくつかの実験を行いました。 ref Rect
ソリューションは、C#を使用して、REFを使用ボンネットの下に非常によく似た何かをしていると思われるために私をリードRect
ためIntPtr
を生成Rect
IntPtr
に変換と同じ速度、程度で動作します。私がそれをRect?
にして、メソッドに条件付きロジックを追加すると、最大50%遅くなります。そのため、4オーバーロードルートがおそらく最も速くなります。しかし、我々は100K回の反復に対して100〜150msを話している。つまり、メソッド自体が非常に安価であるということであり、おそらく条件式に大きな影響があるのだろう。そのように、私は自分のカスタムStructToPtr
ソリューションを使用しています。最も簡単なソリューションです。
あなたのタイトルはあまりよく言われていません。構造体をIntPtrに変換することはできません。ただし、構造体へのポインタを取得できます。 –
@JimMischel:True。私は実際にそれを "変換"することを考えていなかった、私はキャストのラインに沿って何かを考えていた。 Cでは、変数の前に '&'をスラップしてそのアドレスを得ることができます。 – mpen