我有一个非托管 DLL,它公开了一个采用指向数据结构的指针的函数。我有 C# 代码,可以毫无问题地创建数据结构并调用 dll 函数。在对 dll 的函数调用处,指针是正确的。
我的问题是 DLL 保留指向该结构的指针,并在稍后的时间点使用该数据结构指针。当 DLL 使用指针时,它已变得无效(我假设 .net 运行时已将内存移至其他位置)。
这个问题有哪些可能的解决方案?
我能想到的可能的解决方案是:
- 以某种方式修复数据结构的内存位置?我不知道你会如何在 C# 中做到这一点,或者即使你可以。
- 手动分配内存,以便我可以控制它,例如使用 Marshal.AllocHGlobal
- 更改 DLL 函数合约以复制结构数据(这是我目前正在做的短期更改,但如果我可以帮助的话,我根本不想更改 dll,因为它不是我的代码首先)。
还有其他更好的解决方案吗?
最佳答案
您可以使用 AllocHGlobal 分配结构,这会将其放入非托管内存中,GC 不会在其中移动或释放它。您还可以使用像 this 这样的帮助器类让 GC 固定内存,这样在取消固定之前它不会被移动或释放。
关于C# 与非托管 dll 数据结构互操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2860341/