代码之家  ›  专栏  ›  技术社区  ›  Shane Powell

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

  •  2
  • Shane Powell  · 技术社区  · 15 年前

    我有一个非托管DLL,它公开了一个函数,该函数使用指向数据结构的指针。我有C代码,可以创建数据结构并调用dll函数,没有任何问题。在函数调用dll时,指针是正确的。

    这个问题有什么可能的解决办法?

    我能想到的可能解决办法是:

    • 以某种方式修复数据结构的内存位置?我不知道你会怎么做,即使你可以。
    • 手动分配内存,以便我可以控制它,例如使用Marshal.AllocHGlobal
    • 更改DLL函数契约以复制结构数据(这是我目前正在做的短期更改,但如果我可以帮助它,我根本不想更改DLL,因为它不是我的代码开始)。

    5 回复  |  直到 15 年前
        1
  •  2
  •   Dan Bryant    15 年前

    您可以使用 AllocHGlobal this 使GC锁定内存,这样在取消锁定之前它不会被移动或释放。

        2
  •  1
  •   Daniel Renshaw    15 年前
        3
  •  1
  •   Joshua    15 年前
    • 手动分配内存,以便我可以控制它,例如使用Marshal.AllocHGlobal

    在这个特定的例子中,我将P/调用LocalAlloc来分配内存块,并使用StructureToPtr来初始化它。

    更新:因为你可以编辑这个DLL,我会修改这个DLL来提供AllocXXX和FreeXXX函数。

        4
  •  0
  •   Sophtware    15 年前

    如果手头没有DLL来尝试这个方法,很难说这个方法是否可行。我会尝试在你的C#类中使对象“固定”,这样内存就会在你的应用程序生命周期中一直挂起。然后将静态对象传递给DLL。

        5
  •  0
  •   Stephen Cleary    15 年前

    这个 GCHandle GCHandle.Alloc 具有 GCHandleType.Pinned . 当DLL处理完结构后,调用 GCHandle.Free . 要向DLL函数提供对象的地址,请传递它 GCHandle.AddrOfPinnedObject . 只要它被固定,GC就不会移动它。