LabVIEW调用C#编写的.NET类库

电子说

1.3w人已加入

描述

LabVIEW的无法直接完成向dll中传入回调函数,需要用其他语言编写包装器来实现。因此,可利用C#编写包装器,编写中间转换的程序,并生成.NET类库,将底层包含回调函数的dll与LabVIEW连接起来。

本文主要是LabVIEW无法调用回调函数dll的问题的解决方法,也介绍了LabVIEW调用C#库的方法。

net

1)选择“类库(.NET Framework)”(不要选择类库,那个是.NET Core/.NET 5+版本,兼容性有问题)

 

net

 

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中进行加载。选择构造器节点。

net

双击构造器节点,选择浏览

 

net

4)选择生成的库文件。(注:注意调用的底层dll,要放在同一目录下。此处是为了实现调用底层MyCallback.dll,如果仅为了调用.NET类库,可忽略)

net

选择要调用的类,此处是MyCSharpWrapper,与代码相对应。

 netnet

5)在后方连接调用节点,可以选择要执行的方法。

 

netnet

6)编写相关的程序,初始化程序用于判断底层dll的执行情况,SetCallback调用底层的dll并注册回调函数,ReadData中设置相关参数,触发回调函数并获得计算的返回值。

net

7)测试运算正常

 

net

审核编辑 黄宇
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分