C# 与非托管 dll 数据结构互操作

标签 c# .net interop

我有一个非托管 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/

相关文章:

c# - 在 XML 父节点的开头添加一个节点

c# - 如何读取 C# 字符串字典并将其写入文件?

c# - iTextSharp RegionTextRenderFilter 在宽度的情况下不起作用

.net - 在 Silverlight 和 ASP.NET 之间混合应用程序模块

c# - 如何将 Asp.net 页面与 Python 项目集成?

c# - C#工程设置 "Allow unsafe code"的实际作用是什么

c# - Access 等同于 C# List<T> 的 VBA

c# - 如何强制控件不将点击事件传递到树上? WPF C#

c# - ManualResetEvent 的可能竞争条件

vb.net - 无法将公式分配给 Excel 中的单元格区域