NativePtr タイプを宣言します
質問
F#でタイプを宣言できるかどうかを知りたいです。
nativeptr<unit>
これは不可能なようです(コンパイラは文句を言います 「一般的なコンストラクトでは、タイプ「ユニット」が管理されていないタイプであることが必要です」)。使用できる回避策はありますか?
究極の目標は、OpCodeを公開するために私自身のBlitDelegateを宣言することです Cpblk
私のf#コードの一部に。
ありがとう。
編集:
KVBの答えに基づいて試したことは次のとおりです。
type blitDelegate<'T when 'T : unmanaged> = delegate of nativeptr<'T> * nativeptr<'T> * uint32 -> unit
let createBlitDelegate<'T when 'T : unmanaged>() =
let dm = new DynamicMethod("blit",
typeof<System.Void>,
[| typeof<nativeptr<'T>>; typeof<nativeptr<'T>>; typeof<uint32> |])
let ilGenerator = dm.GetILGenerator()
ilGenerator.Emit(OpCodes.Ldarg_0)
ilGenerator.Emit(OpCodes.Ldarg_1)
ilGenerator.Emit(OpCodes.Ldarg_2)
ilGenerator.Emit(OpCodes.Cpblk)
ilGenerator.Emit(OpCodes.Ret)
dm.CreateDelegate(typeof<blitDelegate<'T>>) :?> blitDelegate<'T>
let blit (blitDel:blitDelegate<'T>) dst src byteWidth = blitDel.Invoke(dst, src, byteWidth)
次に、このようなクラスメンバーからこのコードを呼び出します。
let dst = //get nativeint destination address
let src = //get nativeint source address
let bd = createBlitDelegate<'T>()
let tdst = NativePtr.ofNativeInt<'T> dst
let tsrc = NativePtr.ofNativeInt<'T> src
do blit bd tdst tsrc (uint32 size)
//Program.MemCpy.Invoke(dst.ToPointer(), dst.ToPointer(), uint32 size)
これにより、Blitでのランタイムエラーが発生します(System.security.verificationException:操作は、実行時間を不安定にする可能性があります。)
コメントされたコードはうまく機能します(そして見つけることができます ここ)しかし、私のポイントは、それをF#でコーディングすることでした(C#ではありません)。
私が最初に使いたかった理由 nativeptr<unit>
それは実際にはの2つの最初の議論のタイプであるということです MemCpy
デリゲート(一致します void*
タイプ)そして、それを模倣したかった。
編集2:
KVBの編集に基づいて、コードを変更して、静的メンバー(C#バージョンなど)を使用してタイプのデリゲート作成をホストすると、ITが機能します。私は実際に構造体の配列をブリットする必要があるので、私は管理されていない制約を持つバージョンを使用しませんが、これはこれを使用しています。
type blitDelegate = delegate of nativeint * nativeint * uint32 -> unit
解決
あなたの説明から、なぜあなたが欲しいのかは私には明確ではありません nativeptr<unit>
. 。本質的に、 nativeptr<'t>
薄いラッパーです nativeint
ポインターで算術を行うためのヘルパーがいます。あなたが配列を持っている可能性は低いので unit
S、これが実際にどのように役立つかはわかりません。おそらく、あなたがあなたのコードをもっと表示すると、より満足のいく答えを与える方が簡単になるでしょう。
編集
あなたはほとんどすべてを正しくやっていると思います。ただし、匿名でホストされています DynamicMethod
Sは検証可能でなければなりません cpblk
OpCodeは検証可能ではありません。別のコンストラクターを使用してみてください DynamicMethod
タイプまたはモジュールでホストします。