在 LabVIEW 中调用 .NET 封装好的 DLL 时,注册和响应其自定义事件是一个常见需求,但过程稍显繁琐,容易因步骤遗漏而导致注册失败。本文将以一个完整的 C# 类库为例,手把手演示如何在 LabVIEW 中成功注册并处理 .NET 事件,实现跨语言的数据通信闭环。
一、C# 封装自定义事件
首先,我们需要准备一个包含自定义事件的 .NET 类库(DLL)。新建一个 C# 类库项目,定义事件 eventTest 和触发该事件的方法 EventTrigger()。关键代码如下:
using System;
namespace EventCallTest2
{
public class Test
{
private delegate void TestHandler(string message);
public event TestHandler eventTest;
public void EventTrigger(string text)
{
eventTest(text);
}
}
}
代码编译完成后,在项目上右键生成 DLL 文件,供后续 LabVIEW 调用。
二、LabVIEW 事件注册步骤
(一)加载C# DLL
打开 LabVIEW,在程序框图空白处右键,选择 互联接口 -> .NET -> 构造器节点。点击该节点,在弹出的对话框中选择你刚刚生成的 DLL 文件,并实例化其中的 Test 类对象。这是后续所有操作的基础。

(二)注册回调函数
- 放置注册节点:在函数面板选择
互联接口 -> .NET -> 注册事件回调,将其放置到程序框图中。
- 选择事件:点击该节点的事件端口下拉菜单,你会看到 C# 类中定义的
eventTest 事件,选中它。
- 创建用户事件:再放置一个
应用程序控制 面板下的 注册用户事件 函数。为其“事件类型”端口创建一个字符串常量(例如输入“User Event”),并将其“用户事件”输出端连接到 注册事件回调 节点的 User Parameter 端口。
- 创建回调VI:右键单击
注册事件回调 节点的 VI Ref 端口,选择 Create Callback VI。LabVIEW 会自动为你生成一个专门用于处理事件触发的子VI。


- 编辑回调VI:在新生成的回调VI的程序框图中,添加一个
产生用户事件 函数。将回调VI自带的 Event Data 等参数,根据需要连接到 产生用户事件 函数的 事件数据 等输入端口,实现将 .NET 事件参数传递到主VI。

(三)触发DLL里的事件
回到主VI的前面板,放置一个按钮控件(例如命名为“触发”)。为这个按钮的“鼠标释放”事件添加一个事件结构。在该事件分支内,调用之前实例化的 .NET 对象的 EventTrigger 方法,并传入你想发送的字符串参数(例如“你好”)。

(四)响应LabVIEW中的用户事件
在主VI的程序框图中,添加一个事件结构。编辑事件结构,添加一个分支来处理我们之前注册的“User Event”。在这个分支里,你可以对从 .NET 事件传递过来的数据进行处理,例如显示在界面上。

(五)程序退出关闭所有引用
在程序退出(如点击停止按钮)的逻辑部分,务必关闭所有打开的引用:包括 .NET 对象引用和用户事件引用。最后,可以调用 .NET 面板下的 GC Collect 节点,建议主动触发一次垃圾回收,这是一个良好的编程习惯。
三、测试效果
运行整个VI。当点击前面板的“触发”按钮时,程序会调用 DLL 中的 EventTrigger 方法,该方法会触发 eventTest 事件。这个事件被 LabVIEW 的回调VI捕获,并通过用户事件机制传递到主VI的事件结构中,最终将数据(如“你好!”)显示在指定的文本框内。

四、总结
以上便是 LabVIEW 注册并响应 C# .NET 事件的完整流程。有人可能会觉得,数据从 LabVIEW 传到 DLL 再传回来,似乎绕了个圈子。实际上,这个例子旨在清晰演示事件触发与响应的完整链路。在真实的工业应用场景中,这种机制的威力远不止于简单的数据传递。
例如,在通过 .NET 类库控制机械手时,机械手的实时坐标、状态报警等异步信息,正是通过这种事件回调的方式主动推送回来的。开发者只需要在 LabVIEW 中注册对应的事件,即可实时接收数据,而无需额外开辟线程去轮询查询,既节省了系统资源,又确保了响应的实时性。
如果你在 LabVIEW 与 .NET 混合编程中遇到过其他棘手的坑,或者有更巧妙的集成方案,欢迎在技术社区交流分享。
|