gpt4 book ai didi

c# - 从 C# 调用 DLL 时出现内存 AccessViolationException 错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:37:43 26 4
gpt4 key购买 nike

我在从 C# 调用已编译的 DLL 时遇到奇怪的内存读/写错误。我使用 DllImport 获取所需函数的句柄,该函数将返回值写入指向 int 的参数指针(即 int* out)。此函数在一个线程内被多次调用,并在第一个线程的执行生命周期内成功运行。但是,如果在第一个线程完成后启动另一个线程,则对外部 dll 的调用将抛出 AccessViolationException。由于第一个线程的多次调用成功执行,我认为这在某种程度上与第一个线程没有释放指向相关整数参数的指针有关(?)。如果是这样,我如何显式释放该内存?或者,也许有人对这里可能发生的事情有不同的见解?非常感谢。

编辑:Danny 要求提供更多细节,我很乐意答应。这里是调用外部例程的地方:

    int success = -1;
unsafe
{
int res = 0;
int* res_ptr = &res;
int len = cmd.ToCharArray().Length;
int* len_ptr = &len;
CmdInterpreter(ref cmd, len_ptr, res_ptr);
success = *res_ptr;
}

其中 CmdInterpreter 定义为:

    [DllImport("brugs.dll", EntryPoint="CmdInterpreter", 
ExactSpelling=false, CallingConvention = CallingConvention.StdCall)]
public static unsafe extern void CmdInterpreter(ref string cmd, int *len, int *res);

如果有任何其他有用的信息,请告诉我。谢谢!

最佳答案

鉴于该问题仅在涉及多个线程时出现,可能是命令解释器 DLL 使用了某种线程本地存储并且执行不正确。它还可能与第二个线程(产生错误的线程)的 COM 初始化状态有关。

如果您启动新线程并让它在第一个/主线程上对 DLL 进行任何调用之前调用 DLL,那么知道会发生什么会很有趣。如果可行,那可能支持线程本地存储理论。如果它失败了,那将支持 COM 状态理论。

关于c# - 从 C# 调用 DLL 时出现内存 AccessViolationException 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/212155/

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