2

我正在尝试使用 Mono 中托管代码中的 libgsasl 库。我还有其他一些电话在工作,但这个特别的电话让我很适应。我不断收到我“尝试读取或写入受保护的内存。这通常表明其他内存已损坏”的异常。这显然不好。我相信我的问题可能出在双重间接 Gsasl_session 参数中,但我不确定。

本机函数定义如下:

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

我已将托管外部定义为:

[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

好的,不确定我刚刚做了什么,但显然我的问题在其他地方,就像向 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);

当我将该方法调用更改为 out 而不是 ref 时,随后对 gsasl_client_start 的调用开始正常工作。除了我可能一直在双重分配内存然后为 gsasl_client_start 提供 GsaslContext 的不正确内存地址之外,我不确定有什么区别。无论如何,现在事情似乎正在发挥作用。如果有人对此有任何见解,请留下另一个答案,我会标记出来。

于 2012-11-14T02:29:37.270 回答