整合營(yíng)銷(xiāo)服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Win10新版大手術(shù):游戲玩家有福了

          Win10新版大手術(shù):游戲玩家有福了

          沒(méi)有想過(guò)在Windows 10上直接安裝和運(yùn)行Xbox主機(jī)游戲?這樣的愿望似乎并非遙不可及。

          微軟密謀大動(dòng)作

          可能Windows Insider快速通道的會(huì)員已經(jīng)注意到,最近發(fā)布的兩版預(yù)覽系統(tǒng)中,微軟號(hào)稱(chēng)對(duì)游戲進(jìn)行了深入優(yōu)化,不過(guò)感受的方式是鼓勵(lì)用戶從微軟商店下載《腐爛國(guó)度(State of Decay)》這款游戲。微軟并未明確列出對(duì)Windows 10玩游戲到底做了哪些具體修改,整套操作有些詭異。

          資深記者Brad Sams發(fā)現(xiàn)了一些蛛絲馬跡,顯然微軟是要進(jìn)一步拉近Xbox One和Win10 PC之間的距離。比如游戲雖然是從商店下載,但連接的是Xbox文件服務(wù)器;再比如游戲安裝包未XVC格式,這是微軟自2013年以來(lái)一直描述Xbox One平臺(tái)游戲的專(zhuān)屬格式,而在19H1上,借助PowerShell命令就能導(dǎo)入了。

          再結(jié)合一些已經(jīng)出現(xiàn)的源代碼,有理由猜測(cè)微軟正密謀大動(dòng)作,或許就是要把Windows 10和Xbox One游戲不加修飾地直接打通。

          不過(guò)坦率來(lái)說(shuō),Xbox平臺(tái)的主機(jī)獨(dú)占游戲除了《光環(huán)》就幾乎沒(méi)有可圈可點(diǎn)的了,微軟葫蘆里到底賣(mài)的什么藥呢?

          微軟Win10 Lite OS主界面曝光

          除了打通內(nèi)部的關(guān)聯(lián)性外,微軟多年來(lái)一直試圖阻止Chromebook快速的市場(chǎng)份額增長(zhǎng)。最開(kāi)始,微軟曾試圖盡可能優(yōu)化Windows,允許它(在某種程度上)運(yùn)行在廉價(jià)的基于Atom的平板電腦和筆記本電腦上。微軟后來(lái)發(fā)布了Windows 10 S,它無(wú)法運(yùn)行傳統(tǒng)的Windows應(yīng)用程序。現(xiàn)在,通過(guò)開(kāi)發(fā)一個(gè)全新的輕量級(jí)操作系統(tǒng)——Lite OS,微軟似乎更進(jìn)一步。

          據(jù)報(bào)道,Lite OS代號(hào)為“Santorini”,基于Windows Core OS,這是Windows的模塊化版本,將丟棄傳統(tǒng)組件以更好地適應(yīng)新的設(shè)備外形。外媒Petri的編輯Brad Sams聲稱(chēng)已經(jīng)親眼看過(guò)這款新的Lite操作系統(tǒng),上圖是該系統(tǒng)主界面的視覺(jué)效果圖,其界面看起來(lái)類(lèi)似于Chrome OS的應(yīng)用程序抽屜。

          與傳統(tǒng)的Windows 10相比,Lite OS具有更簡(jiǎn)單的UI,同時(shí)保留一些熟悉的元素。底部任務(wù)欄顯然取消了系統(tǒng)托盤(pán),而“開(kāi)始”菜單也會(huì)看起來(lái)不同,不再有活動(dòng)磁貼。但是,文件資源管理器和窗口應(yīng)用程序等經(jīng)典Windows功能仍然存在。

          據(jù)報(bào)道,微軟正在“積極工作”以完成Lite OS。與Windows 10 S非常相似,Lite OS只能運(yùn)行通用Windows平臺(tái)(UWP)應(yīng)用程序和漸進(jìn)式Web應(yīng)用程序。

          外媒稱(chēng),預(yù)計(jì)微軟將在春季開(kāi)始提及這款操作系統(tǒng),可能是在5月份的Build大會(huì)上,但更重要的是,該公司將在今年夏天開(kāi)始為該系統(tǒng)進(jìn)行更廣泛的測(cè)試。

          小獅子最喜歡的雞腿 分割線

          aardio 可以非常方便地調(diào)用 .NET( 不需要任何復(fù)雜的步驟 )。

          .NET 在 aardio 中很好用,系統(tǒng)自帶 .NET 組件以及各種開(kāi)源 .NET 組件在 aardio 用戶中也很受歡迎。

          aardio + .NET 生成的 EXE —— 可避免被 ILSpy 直接反編譯。

          aardio 調(diào)用 .NET 示例:

          //導(dǎo)入 .NET 支持庫(kù)
          import dotNet;
           
          //導(dǎo)入.NET 程序集
          dotNet.import("System"); 
          
          //調(diào)用類(lèi)的靜態(tài)成員函數(shù)
          var isValidHost=System.Uri.CheckHostName("www.aardio.com"); 
          
          //構(gòu)造 .NET 對(duì)象
          var uri=System.Uri("https://www.aardio.com/test?q=aardio");
          
          //讀或?qū)?.Net 對(duì)象的實(shí)例屬性
          var host=uri.Host;
          
          //調(diào)用 .Net 對(duì)象實(shí)例的成員函數(shù)
          var hash=uri.GetHashCode();

          aardio 語(yǔ)法與 JavaScript 接近,請(qǐng)參考:aardio 編程語(yǔ)言快速入門(mén)——語(yǔ)法速覽

          aardio + .Net 開(kāi)發(fā)對(duì) .NET 版本沒(méi)有嚴(yán)格要求 —— 兼容流行 Windows 系統(tǒng)自帶的不同版本 .NET。不但可以調(diào)用系統(tǒng)自帶的大量 .NET 組件,也可以生成體積很小的 EXE 文件。

          Win7 自帶 .Net 3.5.1,支持 lambda

          Win8 自帶 .Net 3.5.1 + .Net 4.5

          Win10 自帶 .Net 4.6

          Win10 1709 自帶 .Net 4.7.1 ,支持 ValueTuple

          Win11 自帶 .NET 4.8


          內(nèi)存加載 .NET 程序集,生成獨(dú)立 EXE

          aardio 提供 dotNet.reference() 函數(shù) —— 可以方便地通過(guò)內(nèi)存數(shù)據(jù)加載 .NET 程序集,這樣就可以生成獨(dú)立 EXE 程序,不再需要帶上一堆 DLL 文件。

          將內(nèi)存數(shù)據(jù)綁定為 .NET 程序集示例:

          import dotNet;
          
          dotNet.reference({
            ["test.mydll"]=$"\test.mydll.dll";
            ["test.core"]=$"\test.core.dll"; 
          });

          dotNet.reference() 的第 1 個(gè)參數(shù)指定程序集名稱(chēng),第 2 個(gè)參數(shù)指定實(shí)際要加載的程序集路徑或內(nèi)存數(shù)據(jù),aardio 代碼在文件路徑前加 $ 號(hào)可將文件數(shù)據(jù)編譯為二進(jìn)制字符串( 發(fā)布后不再需要原文件 )。

          然后就可以正常導(dǎo)入內(nèi)存程序集了,代碼如下:

          dotNet.import("test.mydll");

          上面的代碼導(dǎo)入 .NET 程序集,然后再將 .NET 名字空間導(dǎo)入 aardio ,dotNet.import() 函數(shù)的作用與下面的代碼相同:

          //導(dǎo)入 .NET 程序集
          var assembly=dotNet.load("test.mydll"); 
          
          //導(dǎo)入 .NET 名字空間
          assembly.import("test.mydll");

          aardio 標(biāo)準(zhǔn)庫(kù)提供的 .NET 庫(kù)

          aardio 標(biāo)準(zhǔn)庫(kù)中已經(jīng)提供了一些 .NET 庫(kù),例如 System ,調(diào)用示例:

          //導(dǎo)入 .NET 名空間
          import System; 
          
          //用 System 名字空間下面的類(lèi)構(gòu)造對(duì)象實(shí)例
          var uri=System.Uri("https://www.aardio.com/test?q=aardio")
          
          //讀或?qū)?.Net 對(duì)象的實(shí)例屬性
          var host=uri.Host ;

          aardio 代碼一般使用小駝峰命名風(fēng)格,但 .NET 名字空間或類(lèi)名一般會(huì)大寫(xiě)首字母以示區(qū)別。

          我們右鍵點(diǎn) System ,在彈出菜單內(nèi)點(diǎn)擊「跳轉(zhuǎn)到定義」看一下 System 庫(kù)的源代碼。


          可以看到這個(gè) Sytem 庫(kù)的關(guān)鍵代碼只有兩句:

          import dotNet;
          dotNet.import("System")

          嵌入 .NET 窗口控件到 aardio 窗口

          aardio 窗口嵌入 .NET DataGridView 控件范例的運(yùn)行效果:

          首先要了解 .Net 的所有控件都應(yīng)當(dāng)放在 .Net 創(chuàng)建的窗口里(也就是 System.Windows.Forms.Form 對(duì)象),窗口是管理控件的容器,不能直接把控件單獨(dú)擰出來(lái)往 aardio 窗口里扔。

          如果不想去弄個(gè)窗口,aardio 提供了一個(gè)更簡(jiǎn)單的方法 ,例如把 .Net 的 DataGridView 控件直接嵌入 aardio 窗口:

          import System.Windows.Forms;
          
          var Forms=System.Windows.Forms; 
          var dataGridView=Forms.CreateEmbed("DataGridView",winform.custom);

          非常簡(jiǎn)單。

          好了,現(xiàn)在創(chuàng)建 DataTable 數(shù)據(jù)表,準(zhǔn)備把他顯示到控件里,先創(chuàng)建數(shù)據(jù)列,重點(diǎn)看怎么指定列字段使用的數(shù)據(jù)類(lèi)型:

          //添加數(shù)據(jù)列
          var dataTable=System.Data.DataTable("DT"); 
          dataTable.Columns.Add("名稱(chēng)");//添加列
          dataTable.Columns.Add("計(jì)數(shù)",System.Type.GetType("System.Double")); //添加指定數(shù)據(jù)類(lèi)型的列
          dataTable.Columns.Add("選擇",System.Type.GetType("System.Boolean")); //自動(dòng)顯示復(fù)選框 

          然后綁定數(shù)據(jù)源到視圖:

          //綁定數(shù)據(jù)源到視圖
          var dataView=System.Data.DataView(dataTable);
          dataGridView.DataSource=dataView;
          dataGridView.EditMode=2;

          好吧,想再加一個(gè)下拉框嗎?!這個(gè)就略有些麻煩了,代碼如下:

          //先移除自動(dòng)生成的列
          dataGridView.Columns.Remove("名稱(chēng)"); 
          
          //下面添加下拉框以替換上面移除的列
          var cmbColumn=Forms.DataGridViewComboBoxColumn();
          cmbColumn.Width=120; 
          cmbColumn.Name="Name";
          cmbColumn.DataPropertyName="名稱(chēng)";//對(duì)應(yīng)上面 dataTable 里的字段名
          cmbColumn.HeaderText="名稱(chēng)"; //顯示在列標(biāo)題里的文本
           
          //如果名稱(chēng)與顯示值一樣,那直接給 cmbColumn.DataSource 賦值一個(gè)數(shù)組就可以
          //下面綁定下拉候選框的數(shù)據(jù)源,上面的 DataPropertyName 才是真正要讀寫(xiě)的數(shù)據(jù)值。
          cmbColumn.DisplayMember="Name";//下拉框顯示文本的屬性名
          cmbColumn.ValueMember="Value"; //下拉框選項(xiàng)值的屬性名
          cmbColumn.DataSource=dotNet.createNameValueList(
            { "王五","張三"},
            { "WangWu","ZhangSan"}
          );
          
          //添加這個(gè)新的下拉框到數(shù)據(jù)視圖
          dataGridView.Columns.Add(cmbColumn);
          
          //移動(dòng)到第一列
          dataGridView.Columns.Item["Name"].DisplayIndex=0;

          然后添加下面的代碼響應(yīng) .NET 控件的事件:

          //添加事件(event)
          dataTable.ColumnChanged=function(sender,eventArgs){
            var columnName=eventArgs.Column.ColumnName;
            var value=eventArgs.Row.getItem(columnName);  
            winform.edit.print("已改變列:",columnName," 已變更值:",value);
          }

          然后讀寫(xiě)數(shù)據(jù):

          //添加測(cè)試數(shù)據(jù)
          var row=dataTable.NewRow(); 
          row.ItemArray={"WangWu",123, true}
          dataTable.Rows.Add(row);   
          
          //讀取數(shù)據(jù)
          winform.button.oncommand=function(id,event){ 
           
            for(i=1;dataTable.Rows.Count;1){ 
               var arr=dataTable.Rows[i].ItemArray; 
               winform.edit.print( arr[1] )  ; 
            } 
          }

          以上完整范例源代碼請(qǐng)參考 aardio 自帶范例:


          aardio 范例 / 調(diào)用其他語(yǔ)言 / .Net / 控件窗口 / 嵌入控件

          可以看到 aardio 自帶了大量調(diào)用 .NET 的范例。

          在 aardio 中加載的 .NET 程序集如何調(diào)試

          用下面的代碼在 aardio 中加載 .NET 程序集的 pdb 調(diào)試文件:

          dotNet.loadFile( "程序集路徑" ,"pdb 調(diào)試文件路徑" ); 

          然后用 VS 附加運(yùn)行的 aardio 進(jìn)程就可以調(diào)試了,懂 .NET 的都懂,這個(gè)不多說(shuō)了。

          用 aardio 在運(yùn)行時(shí)編譯 C# 源碼

          直接看 aardio 代碼示例:

          import dotNet; 
          
          //創(chuàng)建 C# 語(yǔ)言編譯器
          var compiler=dotNet.createCompiler("C#");
          
          //DLL 程序集要提前引入,System.dll 默認(rèn)已引入,注意這函數(shù)不支持內(nèi)存 DLL
          compiler.Reference("System.dll");
          
          //設(shè)置待編譯C#源碼( 注釋可賦值為字符串,注釋標(biāo)記首尾星號(hào)數(shù)目要一致 )
          compiler.Source=/*** 
          ?> 
          /*
          如果 C# 代碼開(kāi)始于 aardio 模板標(biāo)記,則啟用 aardio 模板語(yǔ)法。
          參考:《aardio 使用手冊(cè) / aardio 語(yǔ)言 / 模板語(yǔ)法》
          */
          
          namespace CSharpLibrary  
          {  
              public class Object  
              {     
              	<? if _WINXP { ?> 
                  public string Test(){    
                      return "Windows XP"; 
                  }
                  <? } else { ?> 
                  public string Test(){    
                      return "<?=win.version.name ?>"; 
                  }
                  <? } ?> 
              }   
          } 
          ***/
          import win.version;
          
          //編譯并返回程序集,可選在參數(shù)中指定輸出 DLL文件,不指定則編譯為內(nèi)存程序集。
          var assembly=compiler.CompileOrFail(/*"/output.dll"*/);  
          
          //導(dǎo)入名字空間,也可以直接寫(xiě) compiler.import("CSharpLibrary"); 
          assembly.import("CSharpLibrary");  
          
          //使用 C# 編寫(xiě)的類(lèi)構(gòu)造對(duì)象實(shí)例 
          var netObj=CSharpLibrary.Object();
          
          //調(diào)用實(shí)時(shí)編譯的C#函數(shù)
          var ret=netObj.Test(); 
          
          import console;
          console.log( ret );
          console.pause();

          注意 aardio 中的注釋可賦值為字符串,因?yàn)?aardio 要求段注釋的首尾星號(hào)數(shù)目必須一致,所以不會(huì)與其他編程語(yǔ)言沖突,很適合用來(lái)放其他編程語(yǔ)言的源代碼。

          上面的 compiler.Source 可以用一個(gè)字符串指定 C# 源碼,這個(gè)字符串支持類(lèi)似 PHP 的模板語(yǔ)法,所以我們可以用 aardio 代碼靈活地在運(yùn)行時(shí)生態(tài)生成比較復(fù)雜的 C# 源代碼,然后再用 .NET 編譯為程序集。aardio 中的 dotNet.desktop 擴(kuò)展庫(kù)就使用了這種技術(shù)用很少的代碼就實(shí)現(xiàn)了虛擬桌面管理支持庫(kù)。

          默認(rèn)可以將 C# 源碼編譯為內(nèi)存程序集,這樣很適合生成獨(dú)立 EXE 文件。

          注意在 aardio 中編譯 C#,調(diào)用的是 CLR,而 CLR 只有 2.0 / 4.0 的區(qū)別,運(yùn)行時(shí)編譯也只支持這兩個(gè)版本的語(yǔ)法。例如安裝了 .Net 3.5 但沒(méi)有安裝 .Net 4.x ,那么 CLR 2.0 下編譯器不支持 var ,lambda 這些語(yǔ)法 (但是能運(yùn)行編譯后的 DLL,可以事先用 VS 編譯 C# 代碼生成 DLL 程序集)。

          .NET 與 aardio 對(duì)象相互轉(zhuǎn)換規(guī)則

          aardio 會(huì)自動(dòng)處理類(lèi)型轉(zhuǎn)換,調(diào)用 .NET 函數(shù)時(shí)如果參數(shù)類(lèi)型不一致 —— aardio 也會(huì)盡最大可能地轉(zhuǎn)換參數(shù)類(lèi)型,用起來(lái)還是比較輕松的。但簡(jiǎn)單了解一下類(lèi)型轉(zhuǎn)換規(guī)則和原理是有必要的。

          所有原生 .NET 對(duì)象在 aardio 中分為兩類(lèi):

          1、可自動(dòng)轉(zhuǎn)換的簡(jiǎn)單值類(lèi)型

          null值、數(shù)值、字符串、枚舉、 System.Drawing.Color 等簡(jiǎn)單值類(lèi)型,以及這些值類(lèi)型的數(shù)組可以直接交換。aardio 中的 buffer 在 .NET 中對(duì)應(yīng)字節(jié)數(shù)組。

          2、在 aardio 中存為 COM 對(duì)象的 .NET 對(duì)象

          其他原生 .NET 對(duì)象在 aardio 存為 com.NETObject 對(duì)象(對(duì)應(yīng) .NET 中的 System.__ComObject 類(lèi)型),其中有些特殊的 .NET 對(duì)象(例如 struct,ValueTuple),在傳入 aardio 時(shí)會(huì)封包為特殊的 DispatchableObject 對(duì)象。這些 .NET 對(duì)象在 aardio 中都會(huì)被封裝為 dotNet.object 對(duì)象,在 aardio 中使用沒(méi)有太大區(qū)別。

          aardio 與 .NET 交互基于 COM 接口,所以遵守 aardio 的 COM 傳參基本規(guī)則:

          aardio 中的整數(shù)傳入 .NET 默認(rèn)為 int32,小數(shù)默認(rèn)為 double 類(lèi)型。aardio 數(shù)值數(shù)組傳入 .NET 默認(rèn)為 double 類(lèi)型 COM 數(shù)組,純字符串?dāng)?shù)組一律轉(zhuǎn)為 BSTR 數(shù)組。其他數(shù)組轉(zhuǎn)為 Variant 變體類(lèi)型數(shù)組。

          .NET 中的 enum 枚舉會(huì)自動(dòng)轉(zhuǎn)換為 aardio 中的數(shù)值(雙向自動(dòng)轉(zhuǎn)換),

          .NET 中的 struct,tuple 由 .NET 對(duì)象 DispatchableObject 封包后再返回 aardio 。

          aardio 函數(shù)則自動(dòng)轉(zhuǎn)換為委托、事件所需要的委托類(lèi)型。

          .NET 中的 System.IntPtr,System.UIntPtr 類(lèi)型在 aardio 中會(huì)自動(dòng)轉(zhuǎn)換為整數(shù)值,

          aardio 中的指針類(lèi)型(pointer)必須使用 tonumber() 函數(shù)轉(zhuǎn)換為數(shù)值才能傳入 .NET。

          窗口句柄( HWND ) 在 aardio 以整數(shù)值表示,可以直接傳入 .NET。

          System.Drawing.Color 在 aardio 則會(huì)自動(dòng)轉(zhuǎn)換為 ARGB 格式的顏色數(shù)值。

          調(diào)用 .NET 時(shí) ARGB 格式的顏色數(shù)值也能自動(dòng)轉(zhuǎn)換為 System.Drawing.Color 對(duì)象。

          注意 GDI+ 使用 ARGB 格式顏色值,與 gdip庫(kù),plus 控件等兼容。

          aardio 提供以下函數(shù)創(chuàng)建指定靜態(tài)類(lèi)型的 dotNet.object 對(duì)象:

          dotNet.object(value,byRef) 轉(zhuǎn)換為 .Net 對(duì)象。

          dotNet.byte(value,byRef) 轉(zhuǎn)換為 8 位整型數(shù)值。

          dotNet.ubyte(value,byRef) 轉(zhuǎn)換為 8 位無(wú)符號(hào)整型數(shù)值。

          dotNet.word(value,byRef) 轉(zhuǎn)換為 16 位整型數(shù)值。

          dotNet.uword(value,byRef) 轉(zhuǎn)換為 16 位無(wú)符號(hào)整型數(shù)值。

          dotNet.int(value,byRef) 轉(zhuǎn)換為 32 位整型數(shù)值。

          dotNet.uint(value,byRef) 轉(zhuǎn)換為 32 位無(wú)符號(hào)整型數(shù)值。

          dotNet.long(value,byRef) 轉(zhuǎn)換為 64 位整型數(shù)值。

          dotNet.ulong(value,byRef) 轉(zhuǎn)換為 64 位無(wú)符號(hào)整型數(shù)值。

          dotNet.float(value,byRef) 轉(zhuǎn)換為 32 位浮點(diǎn)數(shù)值。

          dotNet.double(value,byRef) 轉(zhuǎn)換為 64 位浮點(diǎn)數(shù)值

          以上函數(shù)會(huì)將參數(shù) 1 存為 .NET 對(duì)象并封包為 DispatchableObject 對(duì)象后再返回 dotNet.object 對(duì)象,( 簡(jiǎn)單的值類(lèi)型也會(huì)轉(zhuǎn)換為 dotNet.object 對(duì)象 ),這可以讓 aardio 直接引用 .NET 中的對(duì)象,方便實(shí)現(xiàn) ref,out 等輸出參數(shù)。

          下面的 aardio 代碼演示了 dotNet.object 的用法:

          import dotNet; 
          var compiler=dotNet.createCompiler("C#");
          
          //指定 C# 源代碼
          compiler.Source=/***
          namespace CSharpLibrary  
          {  
              public class Object  
              {     
                  public static void Test(ref double num,int [] arr){   
                      num=12.3;
                      arr[0]=56;
                  }
              }   
          } 
          ***/
          
          //編譯程序集并導(dǎo)入名字空間  
          compiler.import("CSharpLibrary"); 
          
          //創(chuàng)建 .Net 對(duì)象,啟用引用傳參。 
          var num=dotNet.double(12.5,true);
          
          //創(chuàng)建 .Net 數(shù)組 
          var arr=dotNet.int({1,2,3}); 
          
          //調(diào)用 .NET 函數(shù)。
          CSharpLibrary.Object.Test(num,arr); 
          
          import console;
          
          /*
          dotNet.object 對(duì)象如果存儲(chǔ)的是數(shù)組,
          可用下標(biāo)直接讀寫(xiě)數(shù)組成員。
          */
          console.log( arr[1] ) 
           
          /*
          dotNet.object 對(duì)象如果存儲(chǔ)的是 Primitive,enum,string 類(lèi)型
          或這些類(lèi)型的普通數(shù)組,則可使用 Value 屬性讀寫(xiě)原始值。
          */
          console.log( num.Value ); 
          
          //支持 tostring() 轉(zhuǎn)換為字符串,tonumber() 轉(zhuǎn)換為數(shù)值。
          console.log(tostring(num),tonumber(num)); 
          console.pause();

          下標(biāo)

          C# 中的 下標(biāo)操作符[] 實(shí)際上會(huì)被自動(dòng)轉(zhuǎn)換為訪問(wèn) Item[] 下標(biāo)屬性。

          先看 aardio 代碼示例:

          import dotNet;  
          var compiler=dotNet.createCompiler("C#");
          
          compiler.Source=/****** 
          using System;
          using System.Collections.Generic;
          namespace CSharpLibrary  
          { 
          	public class TestClass
              {
                  private Object [] values=new Object [] {1,2,3,4,5,6,7,8,9};
                  public Object this [int index]
                  {
                      get  { return values[index]; }
                      set  { values[index]=value; }
                  }
                  
                  public Dictionary<string,string> dict=new Dictionary<string,string> ();
             }
          } 
          ******/ 
          
          //編譯并引入 C# 名字空間
          compiler.import("CSharpLibrary"); 
          
          //使用 C# 編寫(xiě)的類(lèi)構(gòu)造對(duì)象實(shí)例
          var netObj=CSharpLibrary.TestClass(); 
          
          //讀下標(biāo)屬性,按 C# 規(guī)則起始下標(biāo)為0,而非 aardio 中的起始下標(biāo)為 1。
          var item=netObj.Item[5];
          var item=netObj.getItem(5); //這樣讀下標(biāo)屬性也可以,支持多參數(shù)
          var item=netObj.Item(5); //get 前綴可以省略
          
          //寫(xiě)下標(biāo)屬性
          netObj.Item[5]=123;
          netObj.setItem(5); //這樣寫(xiě)下標(biāo)屬性也可以,支持多參數(shù)
          
          //如果.NET 對(duì)象的下標(biāo)為數(shù)值,允許省略 Item,但這時(shí)候起始下標(biāo)為 1。
          var item=netObj[6];
           
          //也可以下面這樣賦值:
          netObj[6]=123; 
          
          import console;
          console.log(netObj[6]); 
          
          //字典也可以這樣訪問(wèn)
          netObj.dict.Item["test"]="abc";
          console.log( netObj.dict.Item["test"] );
          
          console.pause();

          要點(diǎn):

          1、在 aardio 中需要用 Item[] 訪問(wèn) .NET 對(duì)象的 Item 屬性。這時(shí)候要注意起始下標(biāo)為 0 ( 遵守 C# 規(guī)則 )。

          2、如果下標(biāo)為數(shù)值可以省略 Item 直接寫(xiě) [],但這時(shí)要起始下標(biāo)為 1 (遵守 aardio 規(guī)則)。

          調(diào)用 UWP

          用下面的 aardio 代碼創(chuàng)建支持調(diào)用 UWP 組件的 C# 編譯器:

          import dotNet.uwpCompiler  
          var uwpCompiler=dotNet.uwpCompiler( "\ocr.dll" )

          可選在 dotNet.uwpCompiler 的第 2 個(gè)參數(shù)指定 Windows.winmd 的路徑,如果沒(méi)有指定 aardio 會(huì)自動(dòng)到下面的目錄去查找最新版本 Windows 10 SDK 目錄( 需要事先安裝 ):

           C:\Program Files (x86)\Windows Kits\UnionMetadata 

          然后在 SDK 目錄下查找 Windows.winmd。我們只是在編譯程序集時(shí)需要 Windows.winmd,運(yùn)行時(shí)不需要它( 也不需要 Windows 10 SDK )。

          例如 aardio 標(biāo)準(zhǔn)庫(kù) dotNet.ocr 包含的 ocr.dll 就是用下面的代碼編譯的:

          import dotNet.uwpCompiler  
          var uwpCompiler=dotNet.uwpCompiler( "\ocr.dll" )
          
          //啟用編譯優(yōu)化
          uwpCompiler.Parameters.CompilerOptions="/optimize"
           
          //設(shè)置待編譯C#源碼
          uwpCompiler.Source=/****** 
          using System;
          using System.Reflection; 
          using System.Collections; 
          using System.Collections.Generic;
          using System.IO;
          using System.Threading.Tasks; 
          using Windows.Graphics.Imaging;
          using Windows.Storage;
          using Windows.Storage.Streams;
          using System.Runtime.InteropServices;
          using Windows.Media.Ocr;
          
          namespace aardio  
          { 
          	public class UwpOcrResult
          	{
          	
              	public UwpOcrResult(OcrResult ocrRet)
              	{
                  	ocrResult=ocrRet; 
              	}
          	
              	public int LineCount()
              	{
                  	return ocrResult.Lines.Count;
              	}
          	
              	public string [] GetWords(int index)
              	{
                  	ArrayList arr=new ArrayList();
                  	foreach (var word in ocrResult.Lines[index].Words)
                  	{
                      	arr.Add(word.Text);
                  	}
          	
                  	return (string[])arr.ToArray(typeof(string));
              	}
          	
              	public object GetWordRects(int index)
              	{
                  	ArrayList arr=new ArrayList();
                  	foreach (var word in ocrResult.Lines[index].Words)
                  	{
                      	double[] rc={ word.BoundingRect.Left, word.BoundingRect.Top, word.BoundingRect.Right, word.BoundingRect.Bottom };  
                      	arr.Add(rc);
                  	}
          	
                  	return (object)arr.ToArray(typeof(object));
              	}
          	
              	private OcrResult ocrResult;
          	
          	}
          	
          	public class UwpOcrEngine  
          	{
              	public string [] AvailableRecognizerLanguages(){   
                  	ArrayList arr=new ArrayList();
                  	foreach (var lang in OcrEngine.AvailableRecognizerLanguages)
                  	{
                      	arr.Add(lang.LanguageTag);
                  	}
                  	return (string [])arr.ToArray(typeof( string));
              	} 
                	
              	public object IsLanguageSupported( string name ){   
                  	Windows.Globalization.Language lang=new Windows.Globalization.Language(name);
                  	return OcrEngine.IsLanguageSupported(lang); 
              	}
          	
              	public UwpOcrResult Recognize(byte[] imgBuffer, string language){   
              		return new UwpOcrResult( RecognizeAsync(imgBuffer, language).GetAwaiter().GetResult() );
              	}
          	
              	async Task<OcrResult> RecognizeAsync(byte[] imgBuffer, string language)
              	{ 
                      	var randomAccessStream=new InMemoryRandomAccessStream();
                      	var outputStream=randomAccessStream.GetOutputStreamAt(0);
                      	var dw=new DataWriter(outputStream);
                      	var task=new Task(()=> dw.WriteBytes(imgBuffer));
                      	task.Start();
                      	await task;
                      	await dw.StoreAsync();
                      	await outputStream.FlushAsync();
          	
                      	BitmapDecoder decoder=await BitmapDecoder.CreateAsync(randomAccessStream);
                      	SoftwareBitmap softwareBitmap=await decoder.GetSoftwareBitmapAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);
                      	Windows.Globalization.Language lang=new Windows.Globalization.Language(language);
          	
                      	OcrEngine engine=OcrEngine.TryCreateFromLanguage(lang);
                      	if (engine !=null)
                      	{
                          	OcrResult ocrResult=await engine.RecognizeAsync(softwareBitmap);
                          	return ocrResult;
                      	}
          	
                      	return null;
              	}
          	}   
          } 
          ******/
          
          //編譯并返回程序集  
          var assembly=uwpCompiler.CompileOrFail();
          
          import console;
          if(assembly) console.logPause("編譯成功",uwpCompiler.Parameters.OutputAssembly);

          dotNet.ocr 支持庫(kù)的體積很小,可以生成獨(dú)立 EXE 文件,調(diào)用代碼也非常簡(jiǎn)潔。下面是調(diào)用 示例:

          更多

          aardio 提供的 .NET 范例非常多,更多功能請(qǐng)參考 aardio 自帶范例,如果大家有任何問(wèn)題可以下面評(píng)論中留言,我會(huì)盡快解答。

          軟昨日向Windows Insider計(jì)劃的Release Preview通道用戶推送Windows 10 KB4505903 (Build 18362.266),其引入一項(xiàng)變化:當(dāng)用戶同時(shí)擁有Edge Dev/Canary通道版本時(shí),經(jīng)典的老版Edge瀏覽器將被隱藏,無(wú)論是在開(kāi)始菜單和Windows全局搜索中都無(wú)法找到。

          不過(guò)用戶仍然可以通過(guò)在運(yùn)行中輸入“microsoft-edge”開(kāi)啟老版Edge瀏覽器。外媒記者已經(jīng)在五臺(tái)更新Build 18362.266)的設(shè)備中驗(yàn)證了這一改變。

          這一改變僅對(duì) Release Preview Ring Insider會(huì)員生效,至于其是否會(huì)在Windows 10 2019五月更新中應(yīng)用,目前仍需觀察。

          Windows 10 20H1

          此外值得一提的是,Windows 10 20H1 預(yù)覽更新后,也包含了一些新的源碼,用戶發(fā)現(xiàn),最新版本的Edge dev/canary被安裝時(shí). 源碼新增了HideUwpEdgeFromAppListIfWin32EdgePresent,用于將舊版本Edge隱藏。


          主站蜘蛛池模板: 亚洲午夜电影一区二区三区| 精品亚洲AV无码一区二区三区| 中文无码AV一区二区三区| 在线精品国产一区二区三区| 亚洲无码一区二区三区| 本免费AV无码专区一区| 男人的天堂精品国产一区| 无码日韩人妻av一区免费| 日韩精品无码一区二区中文字幕| 人妻少妇AV无码一区二区| 亚洲免费一区二区| 亚洲一区无码精品色| 精品视频午夜一区二区| 精品国产日韩亚洲一区91| 国产日韩综合一区二区性色AV| 男插女高潮一区二区| 国产精品亚洲一区二区麻豆| 亚洲av午夜福利精品一区| 亚洲综合无码精品一区二区三区| 国产成人精品视频一区| 国产乱码精品一区二区三区四川 | 国产精品福利一区| 亚洲高清毛片一区二区| 一区二区三区精密机械| 2021国产精品视频一区| 亚洲欧美日韩一区二区三区在线| AV鲁丝一区鲁丝二区鲁丝三区| 亚洲AV无码一区二区三区在线| 国产精品高清一区二区三区| 久久久精品人妻一区二区三区| 久久99国产精一区二区三区 | 日本精品3d动漫一区二区| 综合一区自拍亚洲综合图区| 精品无码人妻一区二区三区18 | 亚洲A∨精品一区二区三区下载| 亚洲高清毛片一区二区| 免费萌白酱国产一区二区| 国产福利一区二区在线视频| 一本岛一区在线观看不卡| 国产在线精品一区二区中文| 无码人妻精品一区二区三区东京热|