gpt4 book ai didi

.Net 和非托管 dll -> 内存问题

转载 作者:行者123 更新时间:2023-12-04 06:08:07 26 4
gpt4 key购买 nike

我在 Visual Studio 2010 中创建了一个非托管 DLL。

为了测试我的 DLL,我使用 Visual Basic 创建了另一个项目,并将其附加到解决方案中。

VB 代码调用 DLL 中的 InstallHook 函数,在 VB 中传递回调函数的委托(delegate)。然后 DLL 创建一个钩子(Hook),每次按下一个键时,调用 VB 回调接收键和一些其他参数作为参数。

好吧,问题是在按下了一些键后,VB 回调中的缓冲区达到了特定大小,程序崩溃了。更具体地说,当最后一次调用回调并将其写入VB中的缓冲区时,它就像在某个地方重叠,因为下次要在DLL中调用回调时,程序崩溃而无法到达回调(dll中的指针很好)

我不太了解.Net 的体系结构,也不知道到底出了什么问题,但我对我所做的代码非常有信心,问题应该是.Net 中的内存管理技术问题。

编辑:我忘了说如果我从 VB 代码中调用回调,那么它工作正常。通常从安装在同一窗口中的 WndProc 调用回调。

谢谢....

最佳答案

the pointer in the dll is fine



我怀疑这是问题所在。如果您将地址传递到 native 例程,然后在单个方法调用的范围之外使用它,您会遇到一些风险。

问题是 .NET 使用压缩垃圾收集器。这意味着运行时可能会在方法调用之间将缓冲区“移动”到完全不同的位置。因此,在某些时候,当您写入它时,它可能位于完全不同的位置。

您可以通过 Marshal 自己分配和管理内存来解决此问题。类(class)。或者,您可以使用 GCHandle class to pin the memory and prevent it from being moved .

关于.Net 和非托管 dll -> 内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8108432/

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