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)测试运算正常

审核编辑 黄宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
测试
+关注
关注
9文章
6429浏览量
131687 -
dll
+关注
关注
0文章
120浏览量
46933 -
LabVIEW
+关注
关注
2022文章
3689浏览量
348656 -
net
+关注
关注
0文章
127浏览量
57162
发布评论请先 登录
相关推荐
热点推荐
c#采集程序中调用NI采集卡?
各位大神好,我现在编写了c#的采集程序,怎样导入NI9215采集卡的动态链接库啊?官网都是支持labview平台的驱动,有支持c#.net平
发表于 11-25 11:37
C#与LbVIEW混合编程
演示了如何使用VS开发环境用C#编写一个dll文件,dll包含2个类,其中第一个类中有2个方法,一个数字加法,一个字符串连接。并且演示了如何在Lab
发表于 04-11 21:48
LABVIEW通过C#调用halcon算子
用VS创建类库键入这些代码,点击生成解决方案,在VS的项目目录下\bin\Debug文件夹里会生成一个DLL。打开LABVIEW-互联接口-.NET-构造器节点,创建一个构造器然后
发表于 02-18 10:54
C# 调用labview导出的 .net assembly 时出现的异常问题
],这个工具包我也已经安装了,可以使用labview查看vi的完整程序框图,但是导出成.net dll之后,使用C#编写调用
发表于 08-07 14:55
C# 调用Labview生成的.NET指令集报错
1.如题,C#调用Labview生成的.NET指令集报错。错误内容为:未能加载文件或程序集“NationalInstruments.LabVIEW
发表于 03-08 16:54
labview连接mongdb问题,找到不.NET类中的泛型类
有没有人用labview连接mongodb数据库的?已下载mongodb的c#驱动,利用labview中的.net控件
发表于 04-08 13:38
C#知识类库
C#知识类库:C#注释符.txt编辑器技巧.txt窗体加载错误码.txt如何设置Path.txt如何在IDE输入命令行参数.txt显示行号.txt重新向IIS注册asp.
发表于 12-26 12:14
•54次下载
LabVIEW网络讲坛第四季:VI编译成.NET共享库文件带来的好处
本集为大家介绍了LabVIEW2009中的一个新功能:将VI编译成.NET共享库文件。通过这种方法,.NET用户可以很方便的在C#等环境中
LabVIEW调用C#编写的.NET类库
评论