电子说
LabVIEW的无法直接完成向dll中传入回调函数,需要用其他语言编写包装器来实现。因此,可利用C#编写包装器,编写中间转换的程序,并生成.NET类库,将底层包含回调函数的dll与LabVIEW连接起来。
本文主要是LabVIEW无法调用回调函数dll的问题的解决方法,也介绍了LabVIEW调用C#库的方法。
1)选择“类库(.NET Framework)”(不要选择类库,那个是.NET Core/.NET 5+版本,兼容性有问题)
2)在.cs文件里面,编写程序。
using System; using System.Runtime.InteropServices; namespace ClassLibrary1 { public delegate void CallbackFunction(int a, int b, ref int sum); public class MyCSharpWrapper { private Action< int, int, int >? triggerCallback = null; //从底层dll中,获取相关函数 [DllImport("MyCallbacks.dll", CallingConvention = CallingConvention.Cdecl)] private static extern int Initialize(); [DllImport("MyCallbacks.dll", CallingConvention = CallingConvention.Cdecl)] private static extern void RegisterCallback(CallbackFunction callback); [DllImport("MyCallbacks.dll", CallingConvention = CallingConvention.Cdecl)] private static extern void TriggerCallback(int a, int b, ref int sum); [DllImport("MyCallbacks.dll", CallingConvention = CallingConvention.Cdecl)] private static extern void Sum(int a, int b, ref int sum); public int InitializeWrapper() { //查看底层dll的执行状态,正常执行时,返回1 return Initialize(); } public void SetCallback() { // 注册回调函数 RegisterCallback(MyCallback); triggerCallback = (a, b, result) = > TriggerCallback(a, b, ref result); } public int ReadData(int a, int b) { //触发设置参数,触发回调函数,获取返回值 int result = 0; triggerCallback!(a, b, result); return result; } public int TestSum(int a, int b) { //用于替代回调函数,测试生成的类库是否可以执行 int result = 0; Sum(a, b, ref result); return result; } private void MyCallback(int a, int b, ref int sum) { // 传入的回调函数 sum = a + b; } } }
3)生成Dll后,在Labview中进行加载。选择构造器节点。
双击构造器节点,选择浏览
4)选择生成的库文件。(注:注意调用的底层dll,要放在同一目录下。此处是为了实现调用底层MyCallback.dll,如果仅为了调用.NET类库,可忽略)
选择要调用的类,此处是MyCSharpWrapper,与代码相对应。
5)在后方连接调用节点,可以选择要执行的方法。
6)编写相关的程序,初始化程序用于判断底层dll的执行情况,SetCallback调用底层的dll并注册回调函数,ReadData中设置相关参数,触发回调函数并获得计算的返回值。
7)测试运算正常
全部0条评论
快来发表一下你的评论吧 !