3

プラットフォーム呼び出しを使用する F# コードを使用しています。私が使用している API の 1 つは、ハンドルを返します。を使用する代わりにnativeint、独自の SafeHandle (具体的にSafeHandleMinusOneIsInvalidは .) を実装しました。これにより、pinvoke 署名を含むモジュールの操作が少し面倒になります。次に例を示します。

type MySafeHandle() = 
    inherit SafeHandleZeroOrMinusOneIsInvalid(true)

    override this.ReleaseHandle() =
        NativeMethods.FreeHandle(base.handle)            
        true

module NativeMethods = 
    [<DllImport("mylibrary.dll")>]
    extern void GetHandle([<Out>]MySafeHandle& handle)
    [<DllImport("mylibrary.dll")>]
    extern void FreeHandle(nativeint handle)

モジュールとクラスが相互に再帰的に参照するため、これはコンパイルされません。これは機能しません。モジュールを上に移動するMySafeHandleGetHandle、SafeHandle が表示されません。

MySafeHandleF# の extern メソッドはモジュール内にある必要があるように見えるため、プラットフォーム呼び出しメソッドを内部に移動することはできません(コンパイラーはそれらをクラスに入れようとするのを止めませんが)。

また、F# の再帰型は、モジュールとクラスの間では機能せず、クラスの間では機能しないようです。

2 つの異なるモジュールを宣言する必要のないこの問題の解決策はありますか? 理想的には、すべてのプラットフォーム呼び出しコードを 1 つのモジュールにまとめたいと考えています。

4

1 に答える 1