LabVIEW的無法直接完成向dll中傳入回調(diào)函數(shù),需要用其他語言編寫包裝器來實現(xiàn)。因此,可利用C#編寫包裝器,編寫中間轉(zhuǎn)換的程序,并生成.NET類庫,將底層包含回調(diào)函數(shù)的dll與LabVIEW連接起來。
本文主要是LabVIEW無法調(diào)用回調(diào)函數(shù)dll的問題的解決方法,也介紹了LabVIEW調(diào)用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? triggerCallback = null;
//從底層dll中,獲取相關函數(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í)行時,返回1
return Initialize();
}
public void SetCallback()
{
// 注冊回調(diào)函數(shù)
RegisterCallback(MyCallback);
triggerCallback = (a, b, result) => TriggerCallback(a, b, ref result);
}
public int ReadData(int a, int b)
{
//觸發(fā)設置參數(shù),觸發(fā)回調(diào)函數(shù),獲取返回值
int result = 0;
triggerCallback!(a, b, result);
return result;
}
public int TestSum(int a, int b)
{
//用于替代回調(diào)函數(shù),測試生成的類庫是否可以執(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中進行加載。選擇構(gòu)造器節(jié)點。

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

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

選擇要調(diào)用的類,此處是MyCSharpWrapper,與代碼相對應。


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


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

7)測試運算正常

審核編輯 黃宇
-
測試
+關注
關注
8文章
5962瀏覽量
130505 -
dll
+關注
關注
0文章
118瀏覽量
46556 -
LabVIEW
+關注
關注
2010文章
3680瀏覽量
343461 -
net
+關注
關注
0文章
127瀏覽量
56945
發(fā)布評論請先 登錄
Qt創(chuàng)建動態(tài)庫給C#調(diào)用,通過回調(diào)完成交互
c#采集程序中調(diào)用NI采集卡?
C#與LbVIEW混合編程
LABVIEW通過C#調(diào)用halcon算子
labview 動態(tài)調(diào)用 C# 生成的dll
C# 調(diào)用labview導出的 .net assembly 時出現(xiàn)的異常問題
C# 調(diào)用Labview生成的.NET指令集報錯
labview連接mongdb問題,找到不.NET類中的泛型類
C#知識類庫
LabVIEW網(wǎng)絡講壇第四季:VI編譯成.NET共享庫文件帶來的好處

LabVIEW調(diào)用C#編寫的.NET類庫
評論