2012-04-05 5 views
33

Ich möchte den Weg der Portierung einer WPF/Silverlight-Komponente nach Windows 8 gehen. Für ein bisschen Kontext ist die Komponente eine real-time WPF Chart, die eine Mischung aus WPF/XAML und Bitmap-Rendering verwendet, um eine hohe Leistung zu erzielen.Was sind die Vor- und Nachteile des Schreibens von C#/XAML vs. C++/XAML WinRT-Anwendungen in Windows8?

Ich möchte, dass die Komponente Metro kompatibel, z. Wird sowohl im Metro-Modus als auch im Desktop-Modus verwendet. Ich lese viel über die Erstellung von C++/WinRT Anwendungen in Windows 8 sowie C#/XAML Anwendungen, aber was sind die Unterschiede zwischen den beiden Frameworks?

Gibt es Einschränkungen, wenn Sie C#/XAML über C++/XAML wählen? Bedenken Sie auch, dass die Portierung von C#/Xaml in .NET4.0 auf Windows8 viel einfacher wäre, wenn ich bei C#/XAML bleiben könnte, aber werde ich in der Lage sein, eine voll funktionsfähige Metro-Komponente mit dieser Methode zu erstellen?

Ihre Kommentare/Vorschläge geschätzt.

Edit:

Wenn Sie diesen Thread zu schließen sind abstimmen, schreiben Sie bitte einen Kommentar, warum. Es ist eine gültige Frage, hat +6 Stimmen, vier Antworten und einen Favoriten. Scheint vernünftig, es zu mir zu behalten!

+0

Wenn Geschwindigkeit wichtig ist, verwenden Sie C++/XAML, wenn nicht C#/XAML verwenden, wird es einfacher für Sie sein, wie Sie sagten – Kobe

+3

Aber wird es wirklich schneller in C++? Das alte Argument C# vs C++ für Geschwindigkeit. Sie können viele Fehler von C# durch bessere Kodierung abmildern. Was ich wissen muss, ist, sind die Feature-Sets für C# gegenüber C++ unterschiedlich. Z.B. kann ich eine voll funktionsfähige Komponente in C#/Xaml erstellen, die sowohl auf Metro- als auch auf Desktop-Modi ausgerichtet ist? Vielen Dank! –

+0

In C++ ist immer schneller, aber Sie können kein Projekt erstellen, das sowohl in Metro als auch auf dem Desktop ausgeführt wird. Es muss das eine oder andere – Kobe

Antwort

22

Ich sehe den Unterschied als eine Designwahl, als eine persönliche Präferenz der Sprache. Präferenz wäre mehr auf VB vs C# bezogen. Und im Allgemeinen sind es die gleichen Unterschiede, die Sie in jeder Anwendung erhalten, in der Sie C++ oder .NET wählen.

C++ wird Ihnen schnellere Startzeiten geben. IIRC, .NET 4.5 verfügt über automatische NGENing-Fähigkeiten (nicht sicher, wie es mit Metro-Apps zusammenhängt), wodurch die typischen langsamen Startzeiten von .NET-Anwendungen gemildert werden können.

C++ wird Ihnen eine niedrigere allgemeine Speichernutzung geben, da es keinen Garbage Collector verwendet. Dies wird bei ressourcenbeschränkten Geräten wie Tablets immer wichtiger. IIRC, .NET 4.5 hat mehr Abschwächungen in GC-Pausen (was die Benutzeroberfläche zum Stolpern bringen kann), sie sind immer noch eine Realität mit verwaltetem Code.

Da .NET und C++ das gleiche WinRT-Framework verwenden, wird es wahrscheinlich nicht zu viele Unterschiede bei der Interaktion mit der XAML/WinRT-Plattform geben (technisch schnellere Interaktion mit WinRT-Objekten über C++, aber der Treffer ist wirklich klein), aber Natürlich ist Ihr Benutzercode in C++ im Allgemeinen schneller als in .NET.

C++ ist im Allgemeinen schwieriger zu reverse engineering, selbst wenn es mit verschleiertem .NET-Code verglichen wird. Obwohl schlaue Diebe Ihre IP trotzdem stehlen können.

Da .NET zuerst für die Bequemlichkeit der Entwickler- und Entwicklerproduktivität erstellt wurde, haben Sie mehr Komfortoptionen bei der Architektur Ihrer Anwendungen (z. B. reflektionsbasierte Tools wie DI/IoC).

Das Iterieren von Anwendungscode kann über .NET einfacher sein, da .NET schneller kompiliert als C++, aber korrekt erstellte C++ - Projekte können erheblich gemildert werden.

Reine .NET-Projekte können "Any CPU" unterstützen, was bedeutet, dass Ihre Anwendung auf allen unterstützten WinRT-Plattformen ausgeführt werden kann. C++ - Projekte müssen Sie einfach neu kompilieren, um ARM x86/64 zu unterstützen. Wenn Ihre .NET-Anwendung von einer benutzerdefinierten C++ - Komponente abhängig ist, müssen Sie für jede Architektur kompilieren.

Da WinRT von Grund auf für die Unterstützung vieler Sprachen entwickelt wurde, ist mein Vorschlag an Entwickler, die nicht mit C++ vertraut sind, bei .NET zu bleiben, aber Bereiche zu erkunden, die von C++ profitieren. Microsoft hat mit den/CX-Projektionen großartige Arbeit geleistet, und die meisten C# -Versionen sollten sich zurechtfinden. Mein Vorschlag an C++ Devs ist, bei C++ zu bleiben und alle Vorteile von C++ zu bekommen.

+0

Wow, danke für den Vergleich/Ablauf. Kann ich eine Frage stellen? Wenn ich eine C#/Xaml-Benutzersteuerung verfasse, kann sie in C++/WinRT-Apps oder nur in C# -Apps verwendet werden? –

+3

Sie können eine C# -WinRT-Komponente aus einer C++ - Anwendung verwenden. Obwohl Devs sich bewusst sein sollten, dass sie die gesamte CLR-Abhängigkeit mit sich bringen ... Einige reine C++ - Anwendungen scheuen sich daher, sie zu benutzen. –

+2

Verstanden. Nun, für ein Win8-Debüt klingt ein direkter Port einer bestehenden Komponente zu C# wie die beste Option. Für mehr spezialisierte Anwendungen kann es sich jedoch lohnen, in C++ zu entwickeln –

3

Von einer XAML Perspektive wird es eine Sprachwahl. Der XAML-UI-Stack ist derselbe, unabhängig davon, welche Code-Sprache Sie hier auswählen. Abhängig von Ihrem Ziel der App könnte es sinnvoller sein, C++ zu verwenden, wenn Sie die Vorteile dessen benötigen, was diese Sprache Ihnen bietet. Wir haben auch die Möglichkeit, DirectX und XAML jetzt in Win8 zu mischen, was normalerweise C++ bedeutet - allerdings mit Projekten wie SharpDX, die immer noch nicht vollständig gültig sind (ja, ich weiß, dass Sie in DirectX einen Performance-Hit zahlen werden) Einpacken in verwalteten Code ... Ich betone nur, dass es getan werden kann).

Ihre Frage scheint zu erstellen, eine wiederverwendbare Komponente, die auf dem Desktop und Metro verwendet werden kann. Dies kann etwas herausfordernd sein, abhängig davon, wie Sie es erstellen, da einige Änderungen erforderlich waren, wie Ressourcen (d. H. Generic.xaml) von einem Dateispeicherort im Vergleich zu einer eingebetteten Ressource geladen werden.

+0

Ich habe diesen Artikel über C#/Xaml und SharDX gelesen: http: //advertboy.wordpress.com/2012/04/04/directx-in-ihr-winrt-xamlc-apps-sharpdx/Sehr gut in der Tat. Ich will Geschwindigkeit aber auch Leichtigkeit des Hafens. Dies ist eine bestehende Komponente in C#/WPF und eine gemeinsame Codebasis würde mich v. Glücklich machen :-) –

+0

+1 Sie können die Microsoft-Geschmack in der Antwort sehen, wenn @TimHeuer sagt "Wir haben auch ..." :) –

2

Der einzige Vorteil, den ich an die Verwendung von C++/XAML denken kann, ist, wenn Geschwindigkeit für Ihr Projekt wichtig ist. Der Vorteil von C#/XAML ist, dass es viel einfacher zu programmieren ist, besonders wenn Ihr Projekt bereits in C# ist.

Inzwischen gibt es keine Möglichkeit, eine Anwendung zu machen, die 8.

hoffte, das hilft, sowohl die U-Bahn und den Desktop in Windows ausgerichtet ist.

+1

I Ich vermute, dass WinRT C++ - Komponenten in C++/WinRT ODER .NET verwendet werden können, während .NET-Komponenten nur in .NET verwendet werden können. Klingt das richtig? –

+1

Ich denke, das wird Sie besser verstehen :) http://en.wikipedia.org/wiki/Windows_Runtime – Kobe

+0

Es gibt viele Vorteile in der Verwendung von C++ (entweder plain oder C++/CX), und die Leistung ist wahrscheinlich die am wenigsten wichtige . Mit .NET Native Out haben die Startzeiten vergleichbare Werte erreicht. Was aber noch wichtiger ist (für mich sowieso): ** Deterministische ** Garbage Collection. In C++ können Sie sehen, wo Objekte angeordnet sind und wo Destruktoren ausgeführt werden. In .NET müssen Sie oft raten, und wenn ein Objekt eine native, freigegebene Ressource umschließt, können Dinge leicht brechen. Vielleicht noch wichtiger: C++ - Komponenten können in jeder Anwendung verwendet werden, ohne eine CLR-Abhängigkeit zu ziehen. – IInspectable

2

Nun können andere wissen mehr, aber basierend auf Microsoft's answer to a question I posed back around WinRT announcement time:

WinRT ist ein Protokoll und eine Reihe von Native API, jede Sprache erlaubt zu der bestehenden Ausführungsumgebung treu zu bleiben - Chakra für JavaScript, CLR C# und der CRT/rohe native Code für C++.

Die schlägt ähnliche Leistung Kompromisse zu dem, was wir derzeit erleben Sie die CLR gegen nativen Code zuzugreifen, was im Wesentlichen ein native Code-API (WinRT). Aber ich freue mich auf einige empirische Untersuchungen, um zu sehen, wie anders WinRT ist.

Verwandte Themen