我们可以将回调函数放在dll中吗?

Posted

技术标签:

【中文标题】我们可以将回调函数放在dll中吗?【英文标题】:Can we put callback function inside dll? 【发布时间】:2011-05-20 19:37:42 【问题描述】:

我正在尝试从另一个使用 Unity3D 引擎的程序中使用 .Net 串行端口方法。

我有一个c#类库(dll),当串口接收到一些数据时注册并实现回调函数。

public CSerialDll()
         
   _serial.DataReceived += new SerialDataReceivedEventHandler(serial_DataReceived);


void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)

   int bytes = _serial.BytesToRead;
   _comBuffer = new byte[bytes];
   _serial.Read(_comBuffer, 0, bytes);
   Console.WriteLine("data recv: " + System.Text.ASCIIEncoding.ASCII.GetString(_comBuffer));

然后在我的另一个程序中,我创建了该类的一个实例。

我想知道我在库 (dll) 中的回调 serial_DataReceived 是否会被调用。我正在尝试从另一个程序中读取库中的 _comBuffer 并且它始终为空(即使当我在同一个应用程序中使用控制台应用程序进行测试时数据正在到来)。

非常感谢任何帮助。

谢谢

【问题讨论】:

【参考方案1】:

<HUNCH>

如果我是类设计者,我会将数据放入回调中,所以如果您查看 SerialDataReceivedEventArgs 类,您会发现它内部是数据的缓冲区。

因此,在您收到一个事件之后,然后调用 read,您实际上丢弃了发送给您的数据并请求更多。

换句话说,是的,它是一个外部库这一事实与它不能正常工作的事实没有任何关系。

</HUNCH>

【讨论】:

这就是我编写自己的串口库的方式,但从它的外观来看,astk 使用的是微软的Serial.IO.Ports 库,它实际上会强制你在收到事件后读取数据,它不附加到事件。实际上,Microsoft SerialPort 类中有很多事情做得不好。【参考方案2】:

只要正确设置了访问修饰符,位于单独 DLL 中的方法通常没有什么特别之处。

但是,根据您设置解决方案的方式,确保您的 bin 文件夹中有最新的 DLL 可能会很麻烦。

【讨论】:

它应该可以工作。但问题是它没有。在使用该 dll 的客户端中,我创建了该 dll 的新实例。所以dll会注册回调。正如您在上面的代码中看到的那样,该回调填充了 _comBuffer ,它具有从外部程序读取的属性。然后在我的客户端程序的更新循环中,我尝试读取该属性。此属性始终为空。但是当我将 dll 项目作为控制台应用程序项目并编写一个 main 方法来测试代码时,我可以从串行接收数据。有任何想法吗?谢谢... @astk 因此,当您单步执行代码时,您的观察结果是什么。另外值得一提的是,仅仅因为代码位于单独的 dll 中并不意味着您不能单步执行。 嗨...如何单步执行?我使用 Unity3D 作为使用该 DLL 的客户端。我可以逐步完成我的统一脚本。但不是在 dll 源级别。谢谢... @astk 您可能应该在前面提到过。我已经更新了您问题的标签,但您应该编辑您的问题以包括您正在使用 Unity3d。人们并不总是阅读 cmets @astk:在 Visual Studio 中,构建您的 dll,然后开始调试。由于您正在调试 dll 而不是可执行文件,因此它会询问您要运行什么程序,此时选择 unity3d 主 .exe 文件。然后,Visual Studio 应该能够识别 dll 中的代码何时运行,并且您应该能够设置断点并使用监视表达式。

以上是关于我们可以将回调函数放在dll中吗?的主要内容,如果未能解决你的问题,请参考以下文章

同步回调函数和异步回调函数

回调函数和钩子函数的说明

C#中调用C的DLL中的回调函数,想实现消息响应机制

什么是回调函数,如何写一个回调函数

异步回调函数

DELPHI调用DLL时的回调函数问题