c#从c dll回调,指针arg回到c#class

时间:2014-01-03 05:27:19

标签: c# c callback dllimport

不确定如何命名我的问题,但是,

我有一些使用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派生工作,但我更喜欢在没有安全处理类的情况下这样做,因为我不想要/需要任何多余的添加,我只需要将指针值放入我的类的IntPtr字段中。

1 个答案:

答案 0 :(得分: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"

}