不确定如何命名我的问题,但是,
我有一些使用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字段中。
答案 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"
}