PInvoke / Interop宣言

时间:2012-11-14 02:15:13

标签: c# .net interop pinvoke

我正在尝试使用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的类。

您可以在documentation中看到此方法的用法。

1 个答案:

答案 0 :(得分:1)

好的,不确定我刚刚做了什么,但显然我的问题出在其他地方,就像向SO发布问题一样。

我正在使用名为gsasl_init的不同函数创建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_clart_start提供GsaslContext的错误内存地址之外还有什么区别。无论如何,事情似乎现在正在发挥作用。如果有人对此有任何见解,请留下另一个答案,我会将其标记出来。

相关问题