2011-09-19 58 views
28

從下圖中,Windows 8平臺和工具。我知道這意味着我可以對Metro風格的應用程序使用C++,C#或JavaScript。我也看了一些構建的主題演講,我在這裏有幾個問題。WinRT上的C++,C#和JavaScript

Windows 8 Platform and Tools http://www.windowsitpro.com/content/content/140554/windows8-platform-tools_2.jpg

  1. 他們有在C++,C#和JavaScript在WinRT的,例如有什麼區別性能,功能,能力等
  2. 我如何創建原生使用JavaScript的Metro應用程序,我是否需要使用MS的js庫或我可以使用任何我熟悉的js,例如jQuery。
  3. 在Metro風格的應用程序中,系統服務只有WinRT,這是否意味着我不能使用低級別的dll?這會帶來性能成本嗎?
+1

關於#2,他們的主題演講中說,jQuery是支持和(IIUC)將被運與VS一起。 – CAFxX

回答

2
  1. 與以往一樣的差異。沒有自動內存管理的C#沒有這樣的事情。託管語言的開銷與往常一樣。

  2. 如果它運行Javascript,你應該可以使用jQuery(這是純粹的JavaScript)。您可能需要調用一些MS函數進行初始化等,但現有的腳本函數仍應運行。

  3. 我見過的最可靠的消息來源表明(至少大部分)WinRT位於Win32之上。該「Windows Kernel Services」塊是Win32的kernel32.dll。 Metro中沒有使用某些較高級別的Win32東西,但是曾經使用過的所有Win32應用程序?

+0

Re「您可能需要調用一些MS函數進行初始化」 - 在我的實驗中,我能夠從新創建的Metro web應用程序項目中刪除所有.js文件,並用空白頁替換HTML - 並且它仍然有效,只要它被打包,部署和運行。所以我想你可以在沒有任何WinRT電話的情況下離開。 「 –

0

建議:

  • 你爲什麼不下載的開發者預覽版,看看自己:

http://msdn.microsoft.com/en-us/windows/apps/br229516

事實:

  • 當然,您仍然可以使用Win32 .dll的(在一個或另一個級別),就像使用.Net一樣。 Windows 8正式推出一年之後:目前還沒有辦法在最終版本中說明具體的「特性」和「功能」。

+1

」當然,你仍然可以使用Win32.dll。「 - 不,你不能 –

3

1)允許語言選擇的目的是讓您選擇語言來獲得語言的內在優勢,而不是因爲它是訪問API的唯一方法。如果你喜歡動態語言,請選擇JavaScript。如果你喜歡靜態類型,但不想處理內存,請使用C#。如果你想要最快的執行速度(但最有能力在腳下拍攝自己),請選擇C++。

2)這取決於你的本意是什麼。如果你只是想讓他們看起來像Metro風格的應用程序,最好的方法是使用開發人員預覽SDK附帶的WinJS庫。

3)WinRT使您能夠從JavaScript代碼編寫和調用自己的C++ DLL或C#程序集。限制是你必須將DLL公開爲WinRT對象,並且你不能調用任何不允許在Metro風格應用程序中使用的函數。

43

關於#1,陣容將大致如下:

JavaScript的 - 最高級別,動態類型,GC。您只能將HTML5/CSS用於您的UI,XAML框架(Windows.UI.XAML名稱空間)不可用。除了WinRT的可用表面之外,還提供了一些標準JS API(由HTML5指定),例如本地存儲或IndexedDB。儘管由於JIT編譯和大量優化,JS引擎仍然非常快速,但是在動態類型化的情況下,嚴重的CPU綁定處理可能比.NET或C++要慢。您可以使用C++和.NET WinRT組件,但不能在JS中編寫自己的代碼。語言投影的某些方面似乎相應地受到限制 - 例如,就我所知,例如,在JS中沒有辦法實現WinRT接口。現有的JS庫通常可以在沒有或很少費力的情況下重用,只要它們在IE10中工作即可。 (C#/ VB) - 中級,靜態類型,可選動態類型(dynamic關鍵字等)和GC。 XAML UI框架是UI的默認UI框架,但您也可以使用WebView控件來使用HTML。提供對WinRT庫的完全訪問權限,但也有一些其自己的功能,有時更方便使用(例如Stream vs IInputStream/IOutputStream)。此外,它還是唯一一個包含對異步操作(asyncawait關鍵字)的特殊語言級支持的應用程序,由於其高度異步的設計,在使用WinRT API時被大量使用。一般來說,提供大多數語法糖 - 除了異步的東西,你會得到LINQ到對象(它在WinRT集合上工作)。可以編寫自己的WinRT組件,然後可以使用JS或C++/CX。現有的.NET庫可能或不可以輕易重用,這取決於它們依賴的.NET Framework中的哪些類;爲Silverlight或WP7編寫的組件最有可能重複使用,無需進行任何修改或進行最少的更改,而爲.NET 4 Full或Client Profile編寫的組件可能需要重大更改才能運行。 C++/CX(Visual C++組件擴展) - 低/中級,靜態類型,不支持GC - 僅適用於refcounting。 「最接近金屬」的地方在於它的對象模型被設計爲直接映射到WinRT而沒有阻抗不匹配 - 因此可以進行計算 - 但仍然足夠高以避免樣板並且通常可以安全使用(例如,異常而不是HRESULT,字符串可見作爲對象而不是手柄,dynamic_cast而不是QueryInterface等)。你和WinRT之間沒有額外的圖層,代理對象等,所有的調用都是直接的。在大多數情況下,三者中最快的是,儘管確切的差異取決於特定的任務,但是可能很小(例如,事件驅動的應用程序沒有或很少的計算),對其他人來說可能很小(例如,解析或重數學)。 UI故事與.NET相同。另外,您還可以獲得整個C++標準庫以及ATL的子集。可以編寫自己的WinRT組件,然後可以使用JS或.NET。現有的C++庫可能會或可能不會輕易重用,具體取決於它們使用的API;那些嚴格依賴於標準C/C++的應用程序通常無需更改,而那些調用Win32 API的應用程序如果依賴Metro應用程序容器中不可用的API,則可能會造成問題。


關於#3,此視頻 - http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C - 應該回答您的大多數問題就從地鐵的應用程序使用的Win32的(這我相信什麼「低級別的DLL」的意思)。請注意,雖然視頻是關於C++的,但這也完全適用於C#,因爲P/Invoke和COM Interop仍然存在。所以如果你可以從C++調用它,你可以從C#調用它。

+0

如果將'HRESULT'轉換爲異常,C++/CX會添加一個附加層。據推測,也有可能使用本地C++,並像任何其他COM對象一樣使用WinRT,絕對不包含任何包裝層。 –

2

其他人已經解釋了3個選項井之間的差異,所以我不會重複。

但是我覺得說到做到:

  • 選擇您知道什麼
  • 選擇什麼可以重複使用的大多數代碼

所以

  • 如果您是.net程序員,然後使用C#或VB.Net
  • 如果你正在移植從Windows手機上使用C#應用或VB.NET
  • 如果你有一個大的C++代碼的基礎上,再考慮使用非託管C++與WinRT的
  • 如果你有一個網站,並希望提供一個脫機版本,您可以通過使用帶有HTML的JavaScript重用代碼(和技巧)
  • 如果您的喜歡JavaScript和HTML,但不喜歡.Net,然後使用...。