C# 与第三方图书馆打交道';当P/s调用时,s函数调用会导致堆损坏

C# 与第三方图书馆打交道';当P/s调用时,s函数调用会导致堆损坏,c#,.net,c,exception,pinvoke,C#,.net,C,Exception,Pinvoke,我创建了一个调用FlexNet Publisher的库包装器。它是用C编写的。我正在尝试P/调用它: [DllImport("lmgr11.dll")] public static extern void free_job(); 它的实现相当简单: void WINAPI free_job() { if (jobPtr != NULL) lc_free_job(jobPtr); jobPtr = NULL; } 文档中说,lc\u free\u job应该释放

我创建了一个调用FlexNet Publisher的库包装器。它是用C编写的。我正在尝试P/调用它:

[DllImport("lmgr11.dll")]
public static extern void free_job();
它的实现相当简单:

void WINAPI free_job()
{
    if (jobPtr != NULL)
        lc_free_job(jobPtr);
    jobPtr = NULL;
}
文档中说,
lc\u free\u job
应该释放一个作业以及所有资源。调用<代码> LcFuffyWorks从原生代码中起作用很好(我让一个ATL对象通过COM对象向它公开一个包装器,并且我可以从VisualC++控制台应用程序中整天使用这个方法,所以我知道它必须工作)。 但是,从C#开始,当我尝试p/调用此方法时,我得到以下错误,使我的应用程序崩溃:

中0x00007FFA39358283(ntdll.dll)处未处理的异常 CerberusTestHarness.exe:0xC0000374:堆已损坏 (参数:0x00007FFA3AF6B0)

为什么会这样?我能抓住它或以任何方式绕过它吗?如果我将调用包装为try-catch,我似乎无法捕获异常,因为它不会引发.NET异常。请注意,我没有
lc\u free\u job
的源代码,因此很遗憾,我无法检查或查看其源代码。它是用C写的。

这个问题是由于我以前调用的C#p/Invoke代码造成的。希望这能帮助其他遇到同样问题的人

我定义这个p/Invoke是为了从返回
char*
的函数中获取错误字符串:

[DllImport("lmgr11.dll")]
public static extern string errstring();
每当我的第三方库出现上述故障时,我都会调用它。这不是调用返回
char*
的方法的正确方法。否则,当从本机端释放错误时,由于此字符串的封送方式,将导致堆损坏

它需要这样定义:

[DllImport("lmgr11.dll")]
public static extern IntPtr errstring();
并呼吁如下:

var errorMessage = Marshal.PtrToStringAnsi(errstring());

缺陷肯定存在于您的代码中。你应该找到它并修复它。你认为是这样,但证据似乎表明不是这样。@Evk请不要建议采用试错法。这对你有用吗?调用约定在代码中显然是正确的。请不要相信我的话,但我记得堆损坏可能会发生在代码的另一部分,但在调用
free\u job
时会暴露出来,因为它试图释放内存。所以,问题可能并不在于
lc\u free\u job
本身。你现在看到的是一些3-4名经验丰富的开发人员凭直觉(“直觉调试”)告诉你,错误最有可能在你自己的代码中。明智的做法是保持谦虚,仔细阅读所有你认为合适的代码。查找与数组和指针相关的bug、未初始化的变量以及常见的经典bug。