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

審核編輯 黃宇
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
測試
+關注
關注
9文章
6201瀏覽量
131343 -
dll
+關注
關注
0文章
120瀏覽量
46838 -
LabVIEW
+關注
關注
2017文章
3688瀏覽量
347058 -
net
+關注
關注
0文章
127瀏覽量
57092
發布評論請先 登錄
相關推薦
熱點推薦
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類庫
評論