我正在尝试使用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中看到此方法的用法。
答案 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的错误内存地址之外还有什么区别。无论如何,事情似乎现在正在发挥作用。如果有人对此有任何见解,请留下另一个答案,我会将其标记出来。