2

Mono のマネージド コードから libgsasl ライブラリを使用しようとしています。他にもいくつかの通話が機能していますが、この特定の通話は私にぴったりです。「保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが壊れていることを示しています。」という例外を受け取ります。これは明らかに良くありません。私の問題は二重間接化 Gsasl_session パラメータにあると思いますが、よくわかりません。

ネイティブ関数は次のように定義されます。

extern GSASL_API int gsasl_client_start (Gsasl * ctx, const char *mech,
                     Gsasl_session ** sctx);

管理された extern を次のように定義しました。

[DllImport("libgsasl-7.dll", CharSet = CharSet.Auto)]
[SuppressUnmanagedCodeSecurity]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public static extern int gsasl_client_start(
    GsaslContext context,
    string mechanism,
    ref GsaslSession session);

GsaslContext と GsaslSession は SafeHandle を継承したクラスです。

このメソッドの使用方法はドキュメントで確認できます。

4

1 に答える 1

1

OK、私が何をしたのかわかりませんが、SOに質問を投稿するときはいつもそうであるように、どうやら私の問題は他の場所にあったようです。

gsasl_init (以前は this として定義されていた) と呼ばれる別の関数を使用して GsaslContext を作成していました。

    [DllImport("libgsasl-7.dll", CharSet = CharSet.Auto)]
    [SuppressUnmanagedCodeSecurity]
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
    public static extern int gsasl_init(ref GsaslContext context);

そのメソッド呼び出しを ref ではなく out に変更すると、その後の gsasl_client_start の呼び出しが正しく機能するようになりました。メモリを二重に割り当ててから、gsasl_client_start に GsaslContext の誤ったメモリ アドレスを提供した可能性があること以外に、違いが何であるかは正確にはわかりません。とにかく、物事は今うまくいっているようです。誰かがこれについて洞察を持っている場合は、別の回答を残してください。マークアップします。

于 2012-11-14T02:29:37.270 に答える