LabVIEW调用库函数节点在VI执行结束后未卸载DLL

更新 Jul 16, 2026

适用于

软件

  • LabVIEW

问题详述

  • 当我运行一个包含调用库函数节点的 VI 后,该节点调用的 DLL 会被锁定,看起来就像 LabVIEW 仍在使用该 DLL,即使 VI 已经停止运行也是如此。
  • 我希望 DLL 仅在 LabVIEW 程序调用它时才被加载到内存中,并在程序结束时自动卸载。

解决方案

当 LabVIEW 使用调用库函数节点调用 DLL 时,会创建一个对该 DLL 的引用。该引用会一直保留在内存中,直到调用该 DLL 的 VI 被关闭为止。可以通过以下两种方式解决:
  1. 动态卸载 DLL
  2. 让调用 DLL 的 VI 由另一个 VI 动态调用

动态卸载DLL

在LabVIEW 8.2之后,动态链接库(后文称为DLL)可以动态加载和卸载。 LabVIEW 2017帮助:调用库函数节点描述了该过程。简要说明如下:

 1.在“调用库函数”对话框中勾选“在程序框图中指定路径(Specify path on diagram选项。双击“调用库函数”节点(Call Library Function node)可以打开该对话框,如下图所示。

2.选中“ 在程序框图中指定路径参数后,“调用库函数”上将显示名为路径输入path in)的接线端,用于接收待调用 DLL 的路径。执行调用库函数时,指定的DLL就会被调入内存中,如下图所示。

3.路径输入接线端也可用于将之前加载的库从内存中卸载。将一个空路径常量(Empty Path Constant)连接到最初加载 DLL 的同一个调用库函数节点的路径输入接线端。下图为一个示例。循环第一次运行时,首次调用函数节点执行条件结构的True分支,调用DLL;从第二次循环开始,当Unload这个布尔输入控件值为真时,再次执行条件结构的True分支,此时会卸载DLL,同时也停止循环;当Unload这个布尔输入控件值为假时,进入条件结构False分支(图中未显示),其中仅包含一些定时逻辑,无其他代码。

使用动态调用的 VI

如果使用调用库函数节点的 VI 被关闭,则对 DLL 的引用也会被释放。因此,如果一个主 VI 动态调用另一个包含 DLL 调用的次级 VI,那么在不关闭主 VI 的情况下,只需关闭次级 VI,即可释放 DLL 句柄所占用的内存。有关如何使用打开 VI 引用实现此功能请参阅 LabVIEW 产品文档中的动态调用VI相关内容。

相关信息

如果将空路径或无效路径连接到与最初加载 DLL 不同的调用库函数节点,则不会将该 DLL 从内存中卸载。此时可能导致 LabVIEW 发生访问冲突而崩溃,因为DLL此时可能已经被卸载。下图展示了一个错误示例: