C#app将C ++ dll通过回调返回到C#app

时间:2009-06-10 23:28:00

标签: c# c++ callback timing

我正在编写一个调用C ++ DLL的C#应用​​程序。这个dll是成像系统的设备驱动程序;当获取图像时,可以逐行地从库中获得图像的预览。 C ++ dll采用回调来填充预览,该回调基本上由最终图像的大小,当前扫描的行和数据本身组成。

问题是,从扫描停止和C#回调停止获取信息的时间起,存在相当严重的延迟。该计划的流程如下:

  1. 从C#
  2. 中分配回调C ++ dll
  3. 用户开始获取数据
  4. 设备启动
  5. dll在几秒钟后开始调用回调(正常)
  6. 设备完成图像形成
  7. dll仍在调用回调图像形成时间的两倍。
  8. 这个dll与C ++应用程序一起工作就好了;似乎没有最后一步延迟。但是,在C#中,如果我立即返回回调,则延迟仍然存在;不管我在回调中做了什么,它就在那里。

    这种延迟是否是从非托管代码调用托管代码的固有限制,或者是否有任何一方可以做到这一点以使其更快?我正在与C ++库编写器联系,因此可以从C ++端实现修复。

    编辑:可以做一些像命名管道一样简单的工作吗?应用程序可以从自己的管道中读取吗?

3 个答案:

答案 0 :(得分:0)

检查垃圾收集目标的本机回调的托管调试助手可能是罪魁祸首(它是否在调试器下的调试模式下?)

请参阅Mike Stall撰写的PSA: Pinvokes may be 100x slower under the debugger博客文章。

答案 1 :(得分:0)

您是否正在跨互操作层进行任何时髦的数据编组?如果是这样,那么你可能会有很大的延迟,而它基本上是通过转换来编组所有图像数据。你可以很容易地测试这个图像数据越大,它需要的时间越长

想到的一些可能的替代方案是 1.使用内存映射文件,虽然你需要实现一个简单的信号量或信号系统来说'我有数据就绪'和'我已经消耗了数据
2.以混合模式编译C ++ dll(可以使用/ clr标志将任何C ++代码编译为.NET)然后使用C#/ CLI
3.使用远程处理和IPC频道 - 可能有点过分但值得一看

希望有所帮助

答案 2 :(得分:0)

原因是C ++方面的延迟是由开发人员发出的,而不是发誓。