LabVIEW的無(wú)法直接完成向dll中傳入回調(diào)函數(shù),需要用其他語(yǔ)言編寫(xiě)包裝器來(lái)實(shí)現(xiàn)。因此,可利用C#編寫(xiě)包裝器,編寫(xiě)中間轉(zhuǎn)換的程序,并生成.NET類(lèi)庫(kù),將底層包含回調(diào)函數(shù)的dll與LabVIEW連接起來(lái)。
本文主要是LabVIEW無(wú)法調(diào)用回調(diào)函數(shù)dll的問(wèn)題的解決方法,也介紹了LabVIEW調(diào)用C#庫(kù)的方法。

1)選擇“類(lèi)庫(kù)(.NET Framework)”(不要選擇類(lèi)庫(kù),那個(gè)是.NET Core/.NET 5+版本,兼容性有問(wèn)題)

2)在.cs文件里面,編寫(xiě)程序。
using System;
using System.Runtime.InteropServices;
namespace ClassLibrary1
{
public delegate void CallbackFunction(int a, int b, ref int sum);
public class MyCSharpWrapper
{
private Action? triggerCallback = null;
//從底層dll中,獲取相關(guān)函數(shù)
[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的執(zhí)行狀態(tài),正常執(zhí)行時(shí),返回1
return Initialize();
}
public void SetCallback()
{
// 注冊(cè)回調(diào)函數(shù)
RegisterCallback(MyCallback);
triggerCallback = (a, b, result) => TriggerCallback(a, b, ref result);
}
public int ReadData(int a, int b)
{
//觸發(fā)設(shè)置參數(shù),觸發(fā)回調(diào)函數(shù),獲取返回值
int result = 0;
triggerCallback!(a, b, result);
return result;
}
public int TestSum(int a, int b)
{
//用于替代回調(diào)函數(shù),測(cè)試生成的類(lèi)庫(kù)是否可以執(zhí)行
int result = 0;
Sum(a, b, ref result);
return result;
}
private void MyCallback(int a, int b, ref int sum)
{
// 傳入的回調(diào)函數(shù)
sum = a + b;
}
}
}
3)生成Dll后,在Labview中進(jìn)行加載。選擇構(gòu)造器節(jié)點(diǎn)。

雙擊構(gòu)造器節(jié)點(diǎn),選擇瀏覽

4)選擇生成的庫(kù)文件。(注:注意調(diào)用的底層dll,要放在同一目錄下。此處是為了實(shí)現(xiàn)調(diào)用底層MyCallback.dll,如果僅為了調(diào)用.NET類(lèi)庫(kù),可忽略)

選擇要調(diào)用的類(lèi),此處是MyCSharpWrapper,與代碼相對(duì)應(yīng)。


5)在后方連接調(diào)用節(jié)點(diǎn),可以選擇要執(zhí)行的方法。


6)編寫(xiě)相關(guān)的程序,初始化程序用于判斷底層dll的執(zhí)行情況,SetCallback調(diào)用底層的dll并注冊(cè)回調(diào)函數(shù),ReadData中設(shè)置相關(guān)參數(shù),觸發(fā)回調(diào)函數(shù)并獲得計(jì)算的返回值。

7)測(cè)試運(yùn)算正常

審核編輯 黃宇
-
測(cè)試
+關(guān)注
關(guān)注
8文章
5701瀏覽量
128830 -
dll
+關(guān)注
關(guān)注
0文章
116瀏覽量
46193 -
LabVIEW
+關(guān)注
關(guān)注
2002文章
3670瀏覽量
335817 -
net
+關(guān)注
關(guān)注
0文章
127瀏覽量
56646
發(fā)布評(píng)論請(qǐng)先 登錄
Qt創(chuàng)建動(dòng)態(tài)庫(kù)給C#調(diào)用,通過(guò)回調(diào)完成交互

LabVIEW與C# 注冊(cè)事件相關(guān)方法

LabVIEW程序中包含.net和C++dll的注意事項(xiàng)簡(jiǎn)介

labview 調(diào)用.net 類(lèi)問(wèn)題
c#采集程序中調(diào)用NI采集卡?
C#與LbVIEW混合編程
LABVIEW通過(guò)C#調(diào)用halcon算子
labview 動(dòng)態(tài)調(diào)用 C# 生成的dll
C# 調(diào)用labview導(dǎo)出的 .net assembly 時(shí)出現(xiàn)的異常問(wèn)題
C# 調(diào)用Labview生成的.NET指令集報(bào)錯(cuò)
labview連接mongdb問(wèn)題,找到不.NET類(lèi)中的泛型類(lèi)
C#知識(shí)類(lèi)庫(kù)

LabVIEW網(wǎng)絡(luò)講壇第四季:VI編譯成.NET共享庫(kù)文件帶來(lái)的好處

評(píng)論