質問

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 ポインターで算術を行うためのヘルパーがいます。あなたが配列を持っている可能性は低いので unitS、これが実際にどのように役立つかはわかりません。おそらく、あなたがあなたのコードをもっと表示すると、より満足のいく答えを与える方が簡単になるでしょう。

編集

あなたはほとんどすべてを正しくやっていると思います。ただし、匿名でホストされています DynamicMethodSは検証可能でなければなりません cpblk OpCodeは検証可能ではありません。別のコンストラクターを使用してみてください DynamicMethod タイプまたはモジュールでホストします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top