gpt4 book ai didi

c# - 处理 P/Invoking 时函数调用导致堆损坏的第 3 方库

转载 作者:行者123 更新时间:2023-11-30 16:48:05 25 4
gpt4 key购买 nike

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

[DllImport("lmgr11.dll")]
public static extern void free_job();

它的实现相当简单:

void WINAPI free_job()
{
if (jobPtr != NULL)
lc_free_job(jobPtr);
jobPtr = NULL;
}

文档说 lc_free_job 应该释放作业以及所有资源。在 native 代码中调用 lc_free_job 工作得很好(我创建了一个 ATL 对象,通过 COM 对象向其公开了一个包装器,并且我可以整天从 Visual C++ 控制台应用程序使用此方法,所以我知道它必须工作)。

但是,在 C# 中,当我尝试 P/Invoke 此方法时,出现以下错误,导致应用程序崩溃:

Unhandled exception at 0x00007FFA39358283 (ntdll.dll) in CerberusTestHarness.exe: 0xC0000374: A heap has been corrupted (parameters: 0x00007FFA393AF6B0).

这是为什么呢?我可以捕获它或以任何方式规避它吗?如果我将调用包装在 try-catch 中,我似乎无法捕获异常,因为它不会引发 .NET 异常。请注意,不幸的是,我没有 lc_free_job 的源代码,因此我无法检查它或查看其源代码。它是用 C 语言编写的。

最佳答案

该问题是由于我之前调用的 C# P/Invoke 代码造成的。希望这对遇到同样问题的其他人有所帮助。

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

[DllImport("lmgr11.dll")]
public static extern string errstring();

每次我的第 3 方库出现问题时,我都会调用它,如上所述。这不是 P/Invoke 返回 char * 的方法的正确方法。否则,当从 native 端释放错误时,由于该字符串的编码(marshal)方式,将导致堆损坏。

它需要这样定义:

[DllImport("lmgr11.dll")]
public static extern IntPtr errstring();

调用方式如下:

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

关于c# - 处理 P/Invoking 时函数调用导致堆损坏的第 3 方库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43118677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com