【问题标题】:c# callback from c dll, pointer arg to c# class来自c dll的c#回调,指向c#类的​​指针arg
【发布时间】:2014-01-03 05:27:18
【问题描述】:

不知道该给我的问题取什么名字,但是,

我有一些使用 DllImports 访问 C dll 的 C# 代码。 在 C# 代码中,我有注册并由 C dll 调用的函数。 C dll 调用将指针传递给它们的函数。

我让它使用 IntPtr 来表示 C# 回调中的 arg。

工作回调方法:

public static int test(IntPtr lua_State)

现在的问题是:

我希望参数类型改为具有 1 个 IntPtr 字段的类,以及将在该 IntPtr 上运行的实例方法

所以新的回调方法如下所示:

public static int test(Lua lua_State)

班级将是:

[StructLayout(LayoutKind.Sequential)]
public class Lua
{
    IntPtr lua_State;

    //Some random methods...
}

不幸的是,这不起作用,回调被调用,但 Classes IntPtr 字段没有获得传递的值,而是 0。

有没有办法让它工作?

编辑:

派生自 SafeHandle 作品,但是我宁愿不使用 safehandle 类,因为我不希望/不需要它添加的任何多余内容,我只需要将指针值放入我的类的 IntPtr 字段中。

【问题讨论】:

  • 使用第一个方法定义,您可以简单地将Lua.lua_State 作为 IntPtr 传递吗?
  • 我不确定你的意思,C dll 正在传递一个指针。第一个方法,工作回调,接收作为 IntPtr 的指针,该示例中不存在 Lua 类。如果需要,我可以将 IntPtr 参数转换为 Lua 类的实例,但我想要的是从 C 传递的指针直接转换为类实例。我犹豫说我希望将指针“编组”到成为一个类,因为我认为这可能是不正确的。

标签: c# c callback dllimport


【解决方案1】:

处理这个问题的最简单方法是让Lua 派生自SafeHandle

public class Lua : SafeHandleZeroOrMinusOneIsInvalid 
{

     private Lua() : base (true)
     {
     }

     override protected bool ReleaseHandle()
     {
         return NativeMethods.CloseHandle(this.handle); //Or how ever you would normally release the pointer when done
     }

     //Other methods that work on the pointer, it is accessed via "this.handle"

}

【讨论】:

  • 从安全句柄派生到底有什么作用?问题不在于 0 或 -1 被传递给回调,问题在于被传递的值没有被转换为类的 IntPtr 字段。
  • SafeHandle 充当IntPtr,但它也允许您添加其他方法,就像您想做的那样。如果需要进行任何清理,它还会在 Lua 超出范围时为您进行清理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 2021-07-04
  • 2021-01-12
  • 2011-11-20
  • 1970-01-01
相关资源
最近更新 更多