プラットフォーム呼び出しを使用する 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)
モジュールとクラスが相互に再帰的に参照するため、これはコンパイルされません。これは機能しません。モジュールを上に移動するMySafeHandle
とGetHandle
、SafeHandle が表示されません。
MySafeHandle
F# の extern メソッドはモジュール内にある必要があるように見えるため、プラットフォーム呼び出しメソッドを内部に移動することはできません(コンパイラーはそれらをクラスに入れようとするのを止めませんが)。
また、F# の再帰型は、モジュールとクラスの間では機能せず、クラスの間では機能しないようです。
2 つの異なるモジュールを宣言する必要のないこの問題の解決策はありますか? 理想的には、すべてのプラットフォーム呼び出しコードを 1 つのモジュールにまとめたいと考えています。