2012-04-05 13 views
33

Mi piacerebbe seguire il percorso di porting di un componente WPF/Silverlight su Windows 8. Per un po 'di contesto, il componente è uno real-time WPF Chart, che utilizza una combinazione di WPF/XAML e rendering bitmap per ottenere prestazioni elevate.Quali sono i pro e i contro della scrittura di applicazioni C#/XAML rispetto a C++/XAML WinRT in Windows8?

Vorrei che il componente fosse compatibile con Metro, ad es. utilizzato in modalità metropolitana e desktop. Ho letto molto sulla creazione di applicazioni C++/WinRT in Windows 8 e sulle applicazioni C#/XAML, ma quali sono le differenze tra i due framework?

Esistono limitazioni se si sceglie C#/XAML su C++/XAML? Considerare anche il porting da C#/Xaml in .NET4.0 a Windows8 sarebbe molto più semplice se potessi limitarmi a C#/XAML, tuttavia sarò in grado di creare un componente Metro completo con questo metodo?

I vostri commenti/suggerimenti sono apprezzati.

Edit:

Se stai votando per chiudere questa discussione, si prega di inviare un commento per questo. È una domanda valida, ha +6 voti, quattro risposte e una preferita. Sembra ragionevole tenerlo a me!

+0

Se la velocità è importante, usa C++/XAML, se non usi C#/XAML sarà più facile per te come hai detto – Kobe

+3

Ma sarà davvero più veloce in C++? Il vecchio argomento C# vs C++ per la velocità. Puoi mitigare molti difetti di C# con una migliore codifica. Quello che devo sapere è che i set di funzionalità per C# rispetto a C++ sono diversi. Per esempio. posso creare un componente completo in C#/Xaml per scegliere come target sia la modalità metropolitana che quella desktop? Grazie! –

+0

In C++ è sempre più veloce, ma non è possibile creare un progetto eseguito sia in metropolitana che in desktop. Deve essere l'uno o l'altro – Kobe

risposta

22

Vedo la differenza come una scelta progettuale, piuttosto che una preferenza personale del linguaggio. La preferenza sarebbe più correlata a VB vs C#. E generalmente sono le stesse differenze che si ottengono in qualsiasi applicazione in cui si sceglie C++ o .NET.

C++ ti darà tempi di avvio più rapidi. IIRC, .NET 4.5 ha capacità di NGENing automatiche (non sono sicuro in che modo si riferiva alle app della metropolitana), quindi questo potrebbe aiutare a mitigare i tempi di avvio lenti tipici delle applicazioni .NET.

C++ consente di ridurre l'utilizzo della memoria generale in quanto non utilizza un garbage collector. Questo diventa sempre più importante su dispositivi con risorse limitate come i tablet. IIRC, .NET 4.5 ha più attenuazioni nelle pause GC (che possono causare l'interfaccia utente allo studder), sono ancora una realtà con il codice gestito.

Poiché .NET e C++ utilizzano lo stesso framework WinRT, probabilmente non ci saranno troppe differenze nell'interazione con la piattaforma XAML/WinRT (l'interazione tecnicamente più rapida con oggetti WinRT tramite C++ ma l'hit è veramente piccolo), ma ovviamente il tuo codice utente sarà generalmente più veloce con C++ che .NET.

C++ è generalmente più difficile da decodificare, anche se confrontato con codice .NET offuscato. Anche se i furbi ladri possono rubare il tuo IP a prescindere.

Poiché .NET è stato creato innanzitutto per la produttività dello sviluppatore e dello sviluppatore, avrete più opzioni di convenienza nell'architettura delle vostre applicazioni (ad esempio, strumenti basati sulla riflessione come DI/IoC).

Iterare il codice dell'applicazione può essere più semplice tramite .NET poiché .NET è più veloce di C++, ma i progetti C++ correttamente creati possono essere mitigati in modo sostanziale.

I progetti .NET puri possono supportare "Qualsiasi CPU", il che significa che l'applicazione può essere eseguita su tutte le piattaforme WinRT supportate. I progetti C++ dovranno semplicemente essere ricompilati per supportare ARM, x86/64. Se l'applicazione .NET dipende da un componente C++ personalizzato, sarà necessario compilare per ogni architettura.

Poiché WinRT è stato creato da zero per supportare molte lingue, il mio suggerimento per gli sviluppatori che non sono a proprio agio con C++ è quello di continuare con .NET ma esplorare aree che traggono vantaggio dal C++. Microsoft ha fatto un ottimo lavoro con le proiezioni/CX e molti sviluppatori di C# dovrebbero essere in grado di orientarsi. Il mio suggerimento per gli sviluppatori C++ è quello di rimanere con C++ e ottenere tutti i vantaggi del C++.

+0

Wow, grazie per il confronto/rundown. Posso fare una domanda? Se creo un usercontrol C#/Xaml, può essere usato nelle app C++/WinRT o solo nelle app C#? –

+3

È possibile utilizzare un componente WinRT C# da un'applicazione C++. Anche se gli sviluppatori devono essere consapevoli del fatto che stanno portando l'intera dipendenza CLR con esso ... Quindi alcune applicazioni C++ pure possono evitare di usarlo. –

+2

Capito. Bene per un debutto su Win8, una porta diretta di un componente esistente in C# sembra l'opzione migliore. Tuttavia, per le app più specializzate potrebbe valere la pena di svilupparsi in C++ –

3

Da una prospettiva XAML diventa una scelta linguistica. Lo stack UI XAML è lo stesso indipendentemente dalla lingua del codice scelta qui. A seconda del tuo obiettivo dell'app, potrebbe essere più sensato usare C++ se hai bisogno dei benefici di ciò che ti fornisce questa lingua.

Abbiamo anche la possibilità di mixare DirectX e XAML ora in Win8 e che in genere significa C++, tuttavia con progetti come SharpDX che non sono ancora completamente validi (sì, mi rendo conto che pagheresti un calo di prestazioni in DirectX per avvolgimento nel codice gestito ... sto solo precisando che può essere fatto).

La tua domanda sembra essere sulla creazione di un componente riutilizzabile che può essere utilizzato su desktop e Metro. Questo potrebbe essere un po 'impegnativo un po' a seconda di come lo si è architettato a causa di come sono state richieste alcune modifiche al modo in cui le risorse (ad esempio, generic.xaml) vengono caricate da un percorso file rispetto a una risorsa incorporata.

+0

In realtà ho letto quell'articolo su C#/Xaml e SharDX: http: //advertboy.wordpress.it/2012/04/04/directx-in-your-winrt-xamlc-apps-sharpdx/Molto buono davvero. Voglio velocità ma anche facilità di porto. Questo è un componente esistente in C#/WPF e una base di codice condivisa mi renderebbe felice. :-) –

+0

+1 È possibile vedere il sapore Microsoft nella risposta quando @TimHeuer dice "Abbiamo anche ..." :) –

2

L'unico vantaggio che posso pensare di utilizzare C++/XAML è se la velocità è importante per il progetto. Il vantaggio di C#/XAML è molto più facile da codificare, specialmente se il progetto è già in C#.

Ormai non c'è modo di presentare una domanda che gli obiettivi sia la metropolitana e il desktop di Windows 8.

Spero che questo aiuti.

+1

I Suppongo che i componenti di WinRT C++ possano essere consumati in C++/WinRT o .NET mentre i componenti .NET possono essere consumati solo in .NET. Suona bene? –

+1

Penso che questo ti faccia capire meglio :) http://en.wikipedia.org/wiki/Windows_Runtime – Kobe

+0

Ci sono molti vantaggi nell'usare C++ (normale o C++/CX), e le prestazioni sono probabilmente le meno importanti . Con .NET Native out, i tempi di avvio hanno raggiunto cifre comparabili. Ciò che è più importante, anche se (per me, comunque): * Deterministic ** garbage collection. In C++ puoi vedere, dove gli oggetti sono disposti e dove i distruttori funzionano. In .NET spesso devi indovinare, e se un oggetto avvolge una risorsa nativa, condivisa, le cose possono facilmente rompersi. Forse ancora più importante: i componenti C++ possono essere utilizzati in qualsiasi applicazione, senza trascinare una dipendenza CLR. – IInspectable

2

bene gli altri possono sapere di più, ma sulla base di Microsoft's answer to a question I posed back around WinRT announcement time:

WinRT è un protocollo e un set di API native, consentendo ogni lingua di rimanere fedele al suo ambiente di esecuzione esistente - Chakra per JavaScript, CLR per C# e il CRT/codice nativo grezzo per C++.

Che suggerisce simili prestazioni compromessi a quello che attualmente sperimentiamo utilizzando il codice nativo CLR vs per accedere a ciò che è essenzialmente un codice API native (WinRT). Ma non vedo l'ora di vedere alcune indagini empiriche su questo per vedere quanto sia diverso WinRT.

Problemi correlati