最近需要在一個CVI程序里加入語音播報功能,由於CVI是基於C語言的編程,實現播報功能無從下手,而C#封裝了庫函數,可以直接調用,實現起來方便很多。下面重點記錄一下CVI程序調用C#生成的Dll文件的過程。
首先,在vs中建立一個類庫,編寫含有語音播報功能的方法,並將其生成Dll文件。
語音播報功能編寫見:http://www.cnblogs.com/leep2007/archive/2012/02/27/2370576.html。
然後,由於CVI程序無法直接調用C#生成的Dll文件,需要先將Dll文件通過CVI工具選項卡中的“Create.NET Controller”,生成一個調用.NET彙編代碼的包裝器(wrapper),該包裝器包含對應的儀器驅動(*.fp)、源文件(*.c)和頭文件(*.h)。包裝器的生成具體步驟如下:
1. 選擇tools菜單欄下的“Create .NET Controller”菜單;
2. 在彈出的對話框中勾選Specify Assembly by Path,選擇需要調用的Dll文件,以及生成的包裝器所在路徑和名稱,如圖1所示。
3. 點擊OK,即在選擇路徑生成包裝器,同時.fp文件已添加至工程中。
圖1 Create.NET Controller 對話框
接下來是調用.fp中的函數來實現語音播報功能。步驟如下:
1. 聲明[Dll名稱]_[類名稱]類型的句柄;
2. 調用CDotNetRegisterAssemblyPath函數註冊.NET的Dll,函數的第一個參數爲Dll名稱(字符串):其值爲生成的*.C文件中指針變量__assemblyName 的值,第二個參數爲.DLL文件存放的絕對路徑,形式爲”D:\\NI\\DLL\\sound.dll”,詳細解釋見函數定義。
3. 調用【Initialize_[DLL名稱]】函數初始化;
4. 調用【[DLL名稱]_[類名稱]__create】函數,實例化類;
5. 調用【[DLL名稱]_[類名稱]_[函數名]】相應的函數,實現播報功能;
6. 調用CDotNetDiscardHandle函數,釋放DLL實例句柄;
7. 調用CDotNetFreeMemory釋放內存;
調用Close_[Dll名稱]關閉DLL。
注:在生成語音dll文件時,是基於.net framework 4.5 ,所以在.net framework 4.0的平臺上使用時,會報-6579錯誤,這時安裝.net framework 4.5插件即可。