C++ 到 C# 回调结构编组
Posted
技术标签:
【中文标题】C++ 到 C# 回调结构编组【英文标题】:C++ to C# Callback Struct Marshalling 【发布时间】:2014-06-24 08:18:39 【问题描述】:我的项目遇到了一些麻烦。
我正在使用已编译的 c++ .dll(我没有机会更改、重新编译或修改它)我有 .h,其中有一些(错误记录的)信息。 此 dll 用于与通过 USB 连接的设备进行交互。该设备已正确配置并使用 dll 提供的功能,我绝对确定它正确响应了 dll 调用。 从 c++ 和 c# 编组非常容易,直到我必须使用回调来注册设备抛出的某些事件。
这是我必须在 c# 中使用的 c++ .h 的重要部分 (第一个和第二个事件是假名)
//First Event data
typedef struct tagFIRST_EVENT
int a;
int b;
int c;
FIRST_EVENT;
//SecondEvent data
typedef struct tagSECOND_EVENT
int e;
int f;
SECOND_EVENT;
//first event callback?
typedef void (CALLBACK *FIRTS_EVENT_LISTENER)(FIRST_EVENT *event, void *userData);
//second event callback?
typedef void (CALLBACK *SECOND_EVENT_LISTENER)(SECOND_EVENT *event, void *userData);
//Register to all given callback in the struct LISTENER
int WINAPI RegisterEvents(LISTENER *listenerGroup );
typedef struct tagLISTENER
FIRTS_EVENT_LISTENER first_listener;
SECOND_EVENT_LISTENER second_listener;
void * userData;
LISTENER;
我在编组让 c++ .dll 调用我定义的 c# 函数来处理设备抛出的事件时遇到了一些麻烦。
我已经找到了许多示例,但我无法以正确的方式使用这些功能。基本上 c# 应用程序崩溃没有任何进一步的信息(我认为是因为错误在 c++ dll 中,我无法捕捉到错误)。
给定上面的代码 sn-p,我可以举一个实现的例子吗?
我进行了深入搜索,只发现了类似的问题,但没有一个可以帮助我。 我在这里进行任何澄清,谢谢您的建议!
【问题讨论】:
你没有提到你有什么麻烦...... 我取消了那个派对,抱歉。我将编辑帖子以回答您的问题。 是否保留处理程序委托的实例,直到不再需要回调? 怎么办?我在 C++ 中看到了一些示例,但我认为这不是重点(可能我认为是磨损的)我可以举个小例子吗? 【参考方案1】:嗯,我不知道你做了多少封送处理,所以我假设你确实在 C# 中为 FirstEvent
和 SecondEvent
数据类型创建了二进制兼容类型。
对于函数指针,您只需要IntPtr
。
毕竟(如果你没有创建二进制兼容的类型,我会扩展它),你所要做的就是创建一个本身是二进制兼容的委托:
delegate void FirstEventListener(ref FirstEvent firstEvent, IntPtr userData);
delegate void SecondEventListener(ref SecondEvent secondEvent, IntPtr userData);
然后,您可以为实际处理程序创建一个委托实例,并使用[Marshal.GetFunctionPointerForDelegate](http://msdn.microsoft.com/en-us/library/at4fb09f.ASPX)
获取指针(如IntPtr
),
请记住,只要可以调用回调,就可以保持该委托实例处于活动状态(即保持对它的引用)。
【讨论】:
非常感谢,我会测试看看!!如果我不能解决这个问题,我会发布一些我的 c# 解决方案。 非常感谢解决,我犯了一个严重的错误。这两个结构(FirstEvent 和 SecondEvent)不是由 ref 提供的。再次感谢!以上是关于C++ 到 C# 回调结构编组的主要内容,如果未能解决你的问题,请参考以下文章
将包含 int 和 int[] 的结构从 C# 编组到 C++