當前位置:編程學習大全網 - 編程語言 - 聽說UiBot支持C++語言擴展,具體要怎麽操作?

聽說UiBot支持C++語言擴展,具體要怎麽操作?

UiBot本身的部分代碼就是基於微軟的.Net框架,用C#語言編寫的。所以,也可以用C#語言編寫UiBot的插件(以下簡稱為.Net插件)。實際上,微軟的.Net框架支持多種編程語言,包括VB.Net、C++/CLI等等,這些編程語言都遵循.Net框架的規範,它們都可以用來編寫.Net插件,但因為C#是微軟主推的編程語言,所以本文用C#舉例,有經驗的讀者亦可將其移植到.Net框架上的其他語言。另外,UiBot對.Net插件的支持也是在不斷升級的,本文以UiBot Creator 5.1版為例,如果在老版本的UiBot上,壹些例子可能無法正常運行,請及時升級。

為了方便您用C#語言寫.Net插件,我們設計了壹個插件的模板,並將其源碼放在GitHub上,點擊這裏即可獲取。如果您習慣使用git,也可以從這個URL拉取:/Laiye-UiBot/extend-example。建議您在寫.Net插件的時候,直接在這個模板的基礎上寫,而無需從頭開始。後續講述的內容,也將圍繞這個模板中的例子展開。

和Java插件類似,.Net插件也需要編譯成擴展名為.dll的文件,才能被UiBot使用。微軟的集成開發環境Visual Studio兼具編寫和編譯的功能,並且也提供了免費的社區版,推薦下載使用。我們提供的模板是基於Visual Studio 2015版本的,您可以選擇這個版本,也可以選更高版本的Visual Studio,但不建議使用低於2015版本的Visual Studio。

安裝了Visual Studio,並下載了我們的.Net插件模板後,可以雙擊UiBotPlugin.sln文件,這是壹個“解決方案”,名字起得很唬人,實際上就是多個相關聯的文件的集合。用Visual Studio打開這個解決方案後。可以看到,裏面包含了很多內容,其中唯壹需要我們動手修改的是UiBotPlugin.cs文件,其他的文件、引用、Properties等都可以不去動。如下圖:

.Net插件的模板

在UiBotPlugin.cs文件裏,有壹個叫UiBotPlugin的命名空間,其中包含了壹個接口(interface)和壹個類(class)。為了避免混淆,我們推薦把這個命名空間的名字改為您的插件名。比如最終的插件文件是DotNetPlugin.dll,那麽插件名就是DotNetPlugin,這個命名空間的名字也改為DotNetPlugin為宜。

從模板中可以看出:在接口裏面聲明了三個函數,在類裏面寫了這三個函數的實現。這三個函數都是例子,您隨時可以把它們的聲明和實現都刪掉,加入您自己的插件函數。但請特別註意:在加入函數的時候,也要保持類似的寫法,需要在接口中聲明,在類中實現,否則,UiBot不能正常識別這個插件函數。

我們用例子中的Add函數為例,嘗試編譯插件,並在UiBot中調用這個函數:

選擇Visual Studio的“生成”(Build)菜單項,編譯這個解決方案之後,會看到在插件的目錄下有個叫Release的目錄,裏面產生了壹個叫UiBotPlugin.dll的文件。

把這個文件手動改名為您的插件名,並保留.dll的擴展名。如改名為DotNetPlugin.dll。

把這個文件放到UiBot的extend/DotNet目錄下。

打開UiBot,新建壹個流程,在源代碼視圖寫入代碼:

Traceprint DotNetPlugin.add(1, 1)

運行此流程,結果如下所示,代表插件調用正常。

.Net插件運行結果

您可能註意到了,在前面的Python插件、Java插件的例子中,都有Add這個例子函數,而除了插件名之外,UiBot調用它們的方式和運行結果都沒有區別。實際上,不同的插件內部實現是有很大差異的,比如在Python語言裏,默認用UTF-8編碼來保存字符串,而在.Net裏默認用UTF-16保存。但UiBot已經幫您抹平了這些差異,讓您在使用的過程中不必關心這些細節。

9.3.2?插件API

和Python、Java插件類似,在.Net插件中,也可以使用插件API,反過來調用UiBot的壹部分功能。如果要調用插件API,只需要基於UiBot提供的模板編寫插件即可,無需做其他任何設置。

.Net插件中能使用的插件API的名字、參數和含義都和Java插件完全壹致,例如,可以用UiBot.API.IsStop()來檢測當前流程是否需要馬上停下來,等等。請參考Java插件的中關於插件API的講解,不再贅述。

在模板中,您可能會看到壹個名叫DotNetAdapter.dll的文件。實際上,這個文件是UiBot每個版本都包含的。從UiBot 5.1版開始,您調用的.Net版的插件API,實際上都在這個文件裏面實現。因此,當您的插件發布的時候,並不需要包含這個文件,因為UiBot已經自帶了。

同時,如果您的UiBot更新到了更高的版本,DotNetAdapter.dll中也可能會包含了更多的插件API。您可以自行從UiBot中拿到新版本的DotNetAdapter.dll文件,並放在您編寫的插件的源代碼所在的目錄下,即可使用到新版的插件API。

9.3.3?變量的傳遞

和Java類似,C#.Net也是靜態類型的編程語言,變量在使用之前需要先定義,且定義時必須指定變量的類型。而且,數組中通常只能包含同壹種類型的數據。這與UiBot的動態類型有很大的不同。

因此,在編寫和使用.Net插件的時候,需要符合以下規定:

對於整數、浮點數、字符串、布爾類型等基本類型的參數,UiBot對.Net插件的類型檢查不是很嚴格,它會盡量進行轉換,即使轉換不成功,也不會報錯。所以,請在使用時特別留意每個參數的類型,避免傳入了不正確的值,而沒有及時發現。

如果需要把字典或數組類型從UiBot中傳到.Net插件中,.Net插件中的參數類型只能使用Newtonsoft.Json.Linq.JArray(對應數組)或者Newtonsoft.Json.Linq.JObject(對應字典)。在模板中,由於我們已經寫了using Newtonsoft.Json.Linq;,所以可以省略前綴,簡寫為JArray(對應數組)或JObject(對應字典),下文亦使用此簡化寫法。

如果需要把字典或數組類型從.Net插件中傳到UiBot中,.Net插件中的返回值類型只能使用JArray(對應數組)或JObject(對應數組)。UiBot會自動把JArray類型的返回值轉換成UiBot中的數組,而把 JObject類型的返回值轉換成UiBot中的字典。

無論傳入參數,還是返回值,這些復合類型在.Net插件和UiBot之間都采用值傳遞的方式,而不是引用傳遞的方式。

在插件模板中,有壹個作為例子的Concat函數,用於演示如何把兩個數組從UiBot傳到.Net插件中,又如何把兩個數組連接後的結果返回到UiBot中。建議讀者仔細閱讀。

9.3.4?插件的引用模塊

UiBot本身是依賴於.Net Framework的,並且假設用戶已經安裝了.Net Framework 4.5.2(含)以上的版本。如果沒有安裝.Net Framework,或者版本不對,UiBot本身都不能運行,當然就更不能使用您編寫的插件了。所以,在編寫插件的時候,只要您的插件依賴的也是.Net Framework 4.5.2版本,就不必擔心環境不匹配的問題。

微軟已經在.Net Framework裏面內置了非常豐富的功能,但難免有的功能仍然沒有包含,需要引用第三方的.Net dll文件。

和Java插件類似,UiBot在加載壹個.Net插件的時候,如果這個.Net插件引用了其他第三方的.Net dll文件,UiBot首先會試圖到.Net插件所在的目錄下去搜索被引用的dll文件。如果沒有找到,還會再到<插件名>.lib這個目錄下去找壹次。比如,我們有個.Net插件,名為A.dll,放置在extend/DotNet目錄中,且引用了B.dll。那麽UiBot會先嘗試找extend/DotNet/B.dll,再嘗試找extend/DotNet/A.lib/B.dll。如果這兩個目錄下都沒有找到,會拋出異常。

9.3.5?其他註意事項

JArray和JObject並不是.Net Framework裏面自帶的,而是使用了開源的Json.Net。在編譯和運行的時候,都需要依賴壹個名為Newtonsoft.Json.dll的文件。 在UiBot提供的模板中,已經包含了這個文件。同時,在每個版本的UiBot中,也會自帶這個文件。因此,您可以直接使用JArray和JObject,而並不需要把這個文件包含在插件當中。

在編譯插件的時候,編譯器可能會警告“DotNetAdapter的處理器架構不匹配”之類的信息。實際上沒有影響,無需理睬這個警告。

.Net插件中的函數支持默認參數。在調用時,如果某些參數有默認值,則可以不傳值,此參數會自動取默認值。

可以在.Net插件的函數中拋出異常,異常可以由.Net插件自行捕獲,也可以不捕獲。如果.Net插件不捕獲,那麽異常會自動被傳到UiBot中,UiBot可以捕獲。 如果UiBot也不捕獲,那麽流程的運行會出錯退出,並且會在出錯信息中說明是由於.Net插件中的異常導致的,以便排查問題。

.Net中的變量、函數都是區分大小寫的,但在UiBot中使用.Net插件時,仍然可以不區分大小寫的調用其中的函數。比如,在前面的例子中,可以在UiBot中寫DotNet.add(1,1),也可以寫dotnet.ADD(1,1),其效果完全壹樣。

  • 上一篇:名人勤學好問故事
  • 下一篇:labview的應用
  • copyright 2024編程學習大全網