繁体   English   中英

P /调用具有C#结构的C委托

[英]P/Invoke a C delegate with structure to C#

我正在尝试将以下C代码转换为C#...,但是在将结构正确转换为该回调时,似乎卡住了。 编译正常,但在运行时堆栈不平衡。

C

INT32 RegisterCallback4ThirdParty(BtSdkCallbackStru* call_back);

typedef struct  _CallbackStru
{
    BTUINT16 type;                  /*type of callback*/
    void *func;                     /*callback function*/
}CallbackStru, *PBCallbackStru;

以下是我的转换:

C#

[DllImport("SDK.dll")]
[return: MarshalAs(UnmanagedType.I4)]
public static extern Int32 RegisterCallback4ThirdParty(ref CallbackStru callback);

public class CallbackStru
{
    public ushort type; //type of callback
    public object func; //callback function
}

在C#中调用例程时:

CallbackStru cb = new CallbackStru();
AppInquiryInd appInquiryInd = AppInquiryInd;
cb.type = 0x04;
cb.func = appInquiryInd;
RegisterCallback4ThirdParty(ref cb);

其中,AppInquiryInd是此委托:

public delegate void AppInquiryInd(UInt32 deviceHandle);

它在RegisterCallback4ThirdParty(ref cb)处失败;

我只是在俯视什么吗?

干杯。

委托声明可能不正确,请尝试:

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void AppInquiryInd(UInt32 deviceHandle);

并确保声明要匹配的结构,以便可以正确编排函数指针:

    [StructLayout(LayoutKind.Sequential)]
    private struct _BtSdkCallbackStru {
        public ushort type;        //type of callback
        public AppInquiryInd func; //callback function
    }

我将class更改为struct ,现在ref参数是正确的:

    [DllImport("SDK.dll", CallingConvention = CallingConvention.Cdecl)]
    private static extern int RegisterCallback4ThirdParty(ref CallbackStru callback);

堆栈不平衡是由缺少CallingConvention引起的。

您还必须确保委托对象对垃圾收集器保持可见,它看不到本机代码正在使用它。 这需要将其存储在静态字段中,或者使用GCHandle.Alloc()为它分配一个额外的句柄。 因此,大致而言:

    CallbackStru cb = new CallbackStru();
    AppInquiryInd callback = new AppInquiryInd(myCallbackMethod);
    ToCleanupLater = GCHandle.Alloc(callback);
    cb.type = 0x04;
    cb.func = callback;
    RegisterCallback4ThirdParty(ref cb);

其中“ ToCleanupLater”是一个占位符变量,因此当本机代码不再进行回调时,可以调用GCHandle.Free()。 如果没有停止回调的机制,那就不用费心释放它了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM