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? 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)測試運算正常

審核編輯 黃宇
-
測試
+關注
關注
8文章
5469瀏覽量
127436 -
dll
+關注
關注
0文章
116瀏覽量
45708 -
LabVIEW
+關注
關注
1981文章
3664瀏覽量
327998 -
net
+關注
關注
0文章
127瀏覽量
56378
發布評論請先 登錄
相關推薦
c#采集程序中調用NI采集卡?
C#與LbVIEW混合編程
LABVIEW通過C#調用halcon算子
C# 調用labview導出的 .net assembly 時出現的異常問題
C# 調用Labview生成的.NET指令集報錯
labview連接mongdb問題,找到不.NET類中的泛型類
C#知識類庫

LabVIEW網絡講壇第四季:VI編譯成.NET共享庫文件帶來的好處

評論