Mono wird häufig als "Ja, .NET ist plattformübergreifend" bezeichnet. Wie berechtigt ist diese Behauptung? [geschlossen]

168

In Was würden Sie zu diesem Zeitpunkt für Ihr Projekt zwischen .NET und Java wählen? Ich würde die Frage "Werden Sie immer unter Windows bereitstellen?" Die wichtigste technische Entscheidung, um in einem neuen Webprojekt vorne mitzumachen, und wenn die Antwort "Nein" lautet, würde ich Java anstelle von .NET empfehlen.

Ein sehr häufiges Gegenargument ist , dass „Wenn wir jemals auf Linux / O X / Was auch immer ausgeführt werden sollen, werden wir nur Mono laufen“ 1 , was ein sehr überzeugendes Argument auf der Oberfläche ist, aber ich bin nicht einverstanden mehr Gründe dafür.

  • OpenJDK und alle vom Hersteller bereitgestellten JVMs haben das offizielle Sun TCK bestanden, um sicherzustellen, dass alles ordnungsgemäß funktioniert. Mir ist nicht bekannt, dass Mono ein Microsoft TCK bestanden hat.
  • Mono verfolgt die .NET-Versionen. Welche .NET-Version wird derzeit vollständig unterstützt?
  • Funktionieren alle GUI-Elemente (WinForms?) In Mono korrekt?
  • Unternehmen möchten sich möglicherweise nicht auf Open Source-Frameworks als offiziellen Plan B verlassen.

Mir ist bewusst, dass mit der neuen Steuerung von Java durch Oracle die Zukunft unsicher ist, aber z. B. bietet IBM JDKs für viele Plattformen an , einschließlich Linux. Sie sind einfach nicht Open Source.

Unter welchen Umständen ist Mono eine gültige Geschäftsstrategie für .NET-Anwendungen?


1 Mark H fasste es wie folgt zusammen : "Wenn die Behauptung lautet, dass " ich eine Windows-Anwendung in .NET habe, sollte sie auf Mono ausgeführt werden " , dann ist dies keine gültige Behauptung - aber Mono hat Anstrengungen unternommen, solche Anwendungen zu portieren einfacher. "

Gemeinschaft
quelle
24
.NET ist die Implementierung der CLI von Microsoft. Mono ist eine CLI-Implementierung, bei der Novell die Führung übernimmt.
ChaosPandion 20.11.10
Dies klingt viel eher nach einer Antwort auf die vorherige Frage als nach einer eigenen Frage. Ich würde vorschlagen, dass Sie überlegen, Ihre Frage zu bearbeiten, um sie eigenständiger zu machen.
Walter
2
@walter, der springende Punkt ist, dass mir die üblichen "Java ist plattformübergreifender als .NET" -Argumente bekannt sind, und ich liste sie auf, damit die Antworten die bestmöglichen Gegenargumente enthalten.
1
Dies ist für die Frage nicht thematisch. Besuchen Sie eine Website mit Geschäftsplänen und stöbern Sie in einigen Beispielplänen, um herauszufinden, was für ein Unternehmen wirklich wichtig ist ... Tech X gegen Tech Y ist ungefähr so ​​wichtig wie die FedEx-Debatte über Ford gegen GM für Lieferwagen.
Red-Dirt

Antworten:

194

Sparkies Antwort hat es verstanden, lassen Sie mich ein wenig ergänzen.

".NET ist plattformübergreifend" ist zu vieldeutig, da sich sowohl das Framework als auch die Welt, für die es ursprünglich erstellt wurde, geändert und weiterentwickelt haben.

Die kurze Antwort lautet:

Die zugrunde liegende Engine für .NET und seine Derivate, der Common Language Infrastructure Standard, ist plattformübergreifend. Wenn Sie Ihren Code für mehrere Plattformen verwenden möchten, müssen Sie die Verwendung der richtigen APIs für die Bereitstellung auf der richtigen Plattform planen die beste Erfahrung auf jeder Plattform.

Die CLI-Familie hat den Ansatz "Einmal schreiben, überall ausführen" nicht ausprobiert, da die Unterschiede zwischen einem Telefon und einem Großrechner zu groß sind. Stattdessen hat sich ein Universum plattformspezifischer API- und Laufzeitfunktionen herausgebildet, mit denen Entwickler die richtigen Tools zum Erstellen großartiger Erlebnisse auf jeder Plattform erhalten.

Denken Sie daran: Programmierer sind nicht mehr auf Windows-PCs oder Unix-Server ausgerichtet. Die Welt ist mehr denn je von faszinierenden Plattformen wie PCs, Spielekonsolen, leistungsstarken Telefonen, Set-Top-Boxen, großen Servern und verteilten Computerclustern umgeben. Eine Einheitsgröße für alle Plattformen würde sich nur auf winzigen Geräten aufgebläht und auf großen Systemen zu schwach anfühlen .

Das .NET Framework-Produkt von Microsoft ist nicht plattformübergreifend, sondern kann nur unter Windows ausgeführt werden. Es gibt Variationen von .NET Framework von Microsoft, die auf anderen Systemen wie Windows Phone 7, XBox360 und Browsern über Silverlight ausgeführt werden. Bei allen handelt es sich jedoch um geringfügig unterschiedliche Profile.

Heutzutage können Sie mit .NET-basierten Technologien auf alle wichtigen Mainstream-Betriebssysteme, Telefone, Mobilgeräte, eingebetteten Systeme und Server zugreifen. Hier ist eine Liste, die zeigt, welche CLI-Implementierung Sie in jedem Fall verwenden würden (diese Liste ist nicht vollständig, sollte jedoch 99% der Fälle abdecken):

  • x86- und x86-64-basierte PC-Computer:
    • Ausführen von Windows -> Normalerweise führen Sie .NET oder Silverlight aus, aber Sie können hier auch Voll-Mono verwenden.
    • Linux, BSD oder Solaris ausführen -> Sie führen Mono oder Silverlight vollständig aus
    • MacOS X ausführen -> Sie führen Mono oder Silverlight vollständig aus
    • Ausführen von Android -> Sie führen eine Mono / Android-Teilmenge aus
  • ARM-Computer:
    • Ausführen von Windows Phone 7: Sie führen Compact Framework 2010 aus
    • Ausführen von Windows 6.5 und älter: Sie führen das alte Compact Framework aus
    • Android-Geräte: Sie führen Mono / Android aus
  • PowerPC-Computer:
    • Sie können Full Mono für alle Linux-, BSD- oder Unix-Betriebssysteme ausführen
    • Sie verwenden Embedded Mono für PS3, Wii oder andere Embedded-Systeme.
    • Auf XBox360 führen Sie CompactFramework aus
  • S390, S390x, Itanium, SPARC-Computer:
    • Du rennst voll Mono
  • Andere eingebettete Betriebssysteme:
    • Sie führen .NET MicroFramework oder Mono mit dem mobilen Profil aus.

Abhängig von Ihren Bedürfnissen kann das oben Genannte ausreichen oder nicht. Es gibt kaum einen Quellcode, der überall ausgeführt werden kann. Beispielsweise wird XNA-Code nicht auf jedem Desktop ausgeführt, während .NET Desktop-Software nicht auf XNA oder dem Telefon ausgeführt wird. Normalerweise müssen Sie Änderungen an Ihrem Code vornehmen, um in anderen Profilen von .NET Framework ausgeführt zu werden. Hier sind einige der mir bekannten Profile:

  • .NET 4.0-Profil
  • Silverlight-Profil
  • Windows Phone 7-Profil
  • XBox360-Profil
  • Mono-Core-Profil - folgt dem .NET-Profil und ist unter Linux, MacOS X, Solaris, Windows und BSD verfügbar.
  • .NET Micro Framework
  • Mono auf dem iPhone-Profil
  • Mono auf Android-Profil
  • Mono auf PS3-Profil
  • Mono auf Wii-Profil
  • Moonlight-Profil (kompatibel mit Silverlight)
  • Erweitertes Moonlight-Profil (Silverlight + vollständiger .NET 4-API-Zugriff)

Jedes dieser Profile ist also ein bisschen anders, und das ist keine schlechte Sache. Jedes Profil ist so konzipiert, dass es auf die Host-Plattform passt und die sinnvollen APIs verfügbar macht. Entfernen Sie die nicht sinnvollen APIs.

Beispielsweise sind die APIs von Silverlight zur Steuerung des Host-Browsers auf dem Telefon nicht sinnvoll. Und Shader in XNA machen auf PC-Hardware keinen Sinn, für die die entsprechende Unterstützung fehlt.

Je schneller Sie erkennen, dass .NET keine Lösung ist, um den Entwickler von den zugrunde liegenden Funktionen der Hardware und der nativen Plattform zu isolieren, desto besser für Sie.

Allerdings sind einige APIs und Stacks auf mehreren Plattformen verfügbar. Beispielsweise kann ASP.NET unter Windows, Linux, Solaris und MacOS X verwendet werden, da diese APIs sowohl in .NET als auch in Mono vorhanden sind. ASP.NET ist auf einigen von Microsoft unterstützten Plattformen wie XBox oder Windows Phone 7 nicht verfügbar und wird auch auf anderen von Mono unterstützten Plattformen wie Wii oder iPhone nicht unterstützt.

Die folgenden Informationen sind erst ab dem 21. November korrekt und viele Dinge in der Mono-Welt werden sich wahrscheinlich ändern.

Die gleichen Prinzipien können auf andere Stacks angewendet werden. Eine vollständige Liste würde eine richtige Tabelle erfordern, von der ich keine Ahnung habe, wie sie hier dargestellt werden soll. Hier ist jedoch eine Liste von Technologien, die auf einer bestimmten Plattform möglicherweise nicht vorhanden sind. Sie können davon ausgehen, dass alles, was hier nicht aufgeführt ist, verfügbar ist.

Core Runtime Engine [überall]

  • Reflection.Emit-Unterstützung [überall, außer WP7, CF, Xbox, MonoTouch, PS3]
  • CPU SIMD-Unterstützung [Linux, BSD, Solaris, MacOS X; Bald PS3, MonoTouch und MonoDroid]
  • Fortsetzungen - Mono.Tasklets [Linux, BSD, Solaris, MacOS, PS3, Wii]
  • Entladen der Baugruppe [Nur Windows]
  • VM-Injection [Linux, BSD, MacOS X, Solaris]
  • DLR [Windows, Linux, MacOS X, Solaris, MonoDroid]
  • Generika [einige Einschränkungen für PS3 und iPhone].

Sprachen

  • C # 4 [überall]
  • C # -Compiler als Dienst (Linux, MacOS, Solaris, BSD, Android)
  • IronRuby [überall ausgeführt, WP7, CF, Xbox, MonoTouch, PS3]
  • IronPython [überall, ausführt WP7, CF, Xbox, MonoTouch, PS3]
  • F # [überall ausführen WP7, CF, Xbox, MonoTouch, PS3]

Server-Stacks

  • ASP.NET [Windows, Linux, MacOS, BSD, Solaris]
  • ADO.NET [überall]
  • LINQ to SQL [überall]
  • Entity Framework [überall]
  • Kern XML-Stack [überall]
    • XML-Serialisierung [überall, außer WP7, CF, Xbox]
  • LINQ to XML (überall)
  • System.Json [Silverlight, Linux, MacOS, MonoTouch, MonoDroid]
  • System.Messaging [Windows; unter Linux, MacOS und Solaris benötigt RabbitMQ]
  • .NET 1 Enterprise Services [Nur Windows]
  • WCF [vollständig unter Windows; kleine Teilmenge unter Silverlight, Solaris, MacOS, Linux, MonoTouch, MonoDroid]
  • Windows-Workflow [Nur Windows]
  • Cardspace-Identität [Nur Windows]

GUI-Stapel

  • Silverlight (Windows, Mac, Linux - mit Moonlight)
  • WPF (nur Windows)
  • Gtk # (Windows, Mac, Linux, BSD)
  • Windows.Forms (Windows, Mac, Linux, BSD)
  • MonoMac - native Mac-Integration (nur Mac)
  • MonoTouch - native iPhone-Integration (nur iPhone / iPad)
  • MonoDroid - native Android-Integration (nur Android)
  • Media Center-APIs - Nur Windows
  • Unordnung (Windows und Linux)

Grafikbibliotheken

  • GDI + (Windows, Linux, BSD, MacOS)
  • Quarz (MacOS X, iPhone, iPad)
  • Kairo (Windows, Linux, BSD, MacOS, iPhone, iPad, MacOS X, PS3, Wii)

Mono-Bibliotheken - Cross Platform, können in .NET verwendet werden, müssen jedoch manuell erstellt werden

  • C # 4-Compiler als Dienst
  • Cecil - CIL Manipulation, Workflow, Instrumentierung von CIL, Linkers
  • RelaxNG Bibliotheken
  • Mono.Data. * Datenbankanbieter
  • Vollständiges System.Xaml (zur Verwendung in Setups, in denen .NET den Stack nicht anbietet)

MonoTouch bedeutet, dass Mono auf dem iPhone ausgeführt wird. MonoDroid bedeutet, dass Mono unter Android ausgeführt wird. PS3- und Wii-Anschlüsse stehen nur qualifizierten Entwicklern von Sony und Nintendo zur Verfügung.

Ich entschuldige mich für die mangelnde Formalität.

miguel.de.icaza
quelle
2
IBM, Wenn Sie dies lesen, möchte ich, dass AIX (oder sogar AS / 400) auf der Miguels-Liste steht !!
4
danke für eine eindeutige, verbindliche (sp?) antwort!
10
Wir wissen, dass IBM mindestens zwei Ports von Mono für AIX erstellt hat, aber die Teams, die den Port erstellt haben, durften die Änderungen nicht zurückgeben.
miguel.de.icaza
3
+1 - Dieser Typ sollte am Mono-Projekt arbeiten! Bitte nicht ködern;)
JeffO
1
@ Jeffo: Dieser Typ ist der Schöpfer von Mono ;-)
Seoul
114

Zunächst müssen Sie zwischen der Common Language Infrastructure (dem offenen Standard) und .NET (der Implementierung dieses Standards durch Microsoft) unterscheiden. Mono ist eine Implementierung der CLI und hat nie behauptet, ein "portables .NET" zu sein. Außerdem ist die C # -Sprache ein offener Standard und nicht streng an .NET gebunden.

Mir ist nicht bekannt, ob Microsoft über ein Tool verfügt, mit dem überprüft werden kann, ob eine Implementierung konform ist. Wenn dies jedoch der Fall ist, sind sich die Mono-Leute ziemlich sicher, dass sie es haben und verwenden.

Mono folgt dem .Net, aber kaum. Mono kann C # 4.0-Code ausführen (aktuelle .NET-Version). Darüber hinaus hat Microsoft kürzlich alle DLR-Codes und -Bibliotheken als Open Source-Dateien (unter der Apache 2.0-Lizenz) bereitgestellt, sodass Mono erst in der vergangenen Woche Sprachen wie IronPython, IronRuby und F # als Open Source-Dateien verwenden konnte. Darüber hinaus veröffentlicht Microsoft regelmäßig CTPs der kommenden Funktionen in .NET, mit denen Mono-Entwickler mit den aktuellen Release-Versionen auf dem Laufenden bleiben können.

In .NET gibt es eine Reihe von Tools und Erweiterungen, z. B. Codeverträge. Diese sind nicht immer vollständig in Mono implementiert. (Derzeit gibt es meines Erachtens einen Teilvertragsprüfer für Requires-Verträge.) Diese werden in .NET-Apps ohnehin nicht häufig verwendet, aber wenn ihre Beliebtheit steigt, steigt auch die Rate, mit der sie in Mono implementiert werden.

WinForms sind nicht (vollständig) portierbar. Sie sind .NET-spezifisch und nicht Teil der CLI. Die CLI gibt keinen bestimmten Widget-Satz an. Es gibt jedoch plattformübergreifende Widget-Sets (GTK # und Silverlight). Wenn Sie eine Anwendung von Grund auf mit Blick auf die Portabilität schreiben, würden Sie eine dieser Anwendungen anstelle von Winforms / WPF verwenden. Darüber hinaus bietet mono einen Thin Wrapper für die Winforms-API, mit dem vorhandene Winforms-Apps einfacher in GTK # portiert werden können (ohne vollständiges Umschreiben).

Mono bietet ein Tool, den Mono Migration Analyzer (MoMA), mit dem eine vorhandene .Net-Anwendung verwendet werden kann, um Sie über die Portabilität zu informieren. (Identifizieren Sie z. B. nicht portierbare Bibliotheken, die verwendet werden, P / Invokes usw.).

Für Unternehmen, die nicht auf Open Source angewiesen sind, kann Mono erneut lizenziert werden. Das Eigentum an Code, der zu mono hinzugefügt wurde, wird an novell übergeben, das es auf andere Weise als die übliche LGPL-Lizenz lizenzieren kann (die ohnehin nur sehr wenige Einschränkungen aufweist).

Was die Behauptung ".NET ist portabel" betrifft, kann dies meiner Meinung nach eine gültige Behauptung sein, wenn Sie Code von Grund auf schreiben und sich der Portabilitätsprobleme mit dem Framework bewusst sind. Wenn die Behauptung lautet, dass "Ich habe eine Windows-Anwendung in .NET geschrieben, die auf Mono ausgeführt werden sollte", dann ist dies keine gültige Behauptung. Mono hat jedoch Anstrengungen unternommen, um die Portierung solcher Anwendungen zu vereinfachen.

Mark H
quelle
20
+1 für den letzten Absatz.
Davy8
4
the C# language is an open standard, and is not strictly tied to .NET.und C# 4.0 code (current .NET version)sind widersprüchlich
Jader Dias
9
Ihr letzter Punkt ist gut und gilt auch für Java. Nur weil Sie Ihre App in Java codiert haben, heißt das nicht, dass sie automatisch auf jede Plattform portiert werden kann, die Java unterstützt. Insbesondere für komplexere Projekte finden Sie in vielen Java-Anwendungen plattformspezifischen Code.
Dean Harding
5
@ user8057: Winforms ist zu 100% implementiert? Ernsthaft? Überprüfen Sie die RichTextBox-Komponente. Testen Sie die Drag & Drop-Funktionalität der Tree-Komponente. Swing ist hingegen zu 100% plattformübergreifend, was jedoch bedeuten kann, dass auf allen Plattformen gesaugt wird.
Dan Rosenstark
2
@ Yar: LOL für "obwohl das Saugen auf allen Plattformen bedeuten könnte" :-)
Wizard79
14

Punkt für Punkt:

  • OpenJDK und alle vom Hersteller bereitgestellten JVMs haben das offizielle Sun TCK bestanden, um sicherzustellen, dass alles ordnungsgemäß funktioniert. Mir ist nicht bekannt, dass Mono ein Microsoft TCK bestanden hat.
    Es gibt eine Spezifikation, der die Microsoft CLR entspricht. Mono ist kein Klon von Microsofts CLR, sondern eine Implementierung derselben Spezifikation. Einerseits besteht die Möglichkeit, dass dies zu einer noch größeren Inkompatibilität führt. In der Praxis hat dies bei Mono sehr gut funktioniert.
  • Mono verfolgt die .NET-Versionen. Welche .NET-Version wird derzeit vollständig unterstützt?
    Da die Dokumentation für .Net vor der eigentlichen Version veröffentlicht wurde, hatte mono die Unterstützung für .Net 4 bereits vor der offiziellen Microsoft-Version abgeschlossen (keine Betaversion) . Darüber hinaus kann mono sehr gut dokumentieren, welche Dinge nicht unterstützt werden, und es gibt einige Tools, die Sie für vorhandene Projekte ausführen können, um Stellen mit potenzieller Inkompatibilität zu finden.
  • Funktionieren alle GUI-Elemente (WinForms?) In Mono korrekt?
    Die überwiegende Mehrheit der Winforms funktioniert einwandfrei. WPF, nicht so sehr. Ich habe gehört, dass dies auch für Java gilt - viele der erweiterten Widget- / GUI-Toolkits werden nicht auf allen Plattformen so gut unterstützt.
  • Unternehmen möchten sich möglicherweise nicht auf Open Source-Frameworks als offiziellen Plan B verlassen.
    Wenn dies der Fall ist, werden sie definitiv nicht mit Java arbeiten, da dadurch ein Open Source-Framework in Plan A noch weiter oben steht.

Zusammenfassend lässt sich sagen, dass Sie, wenn Sie jetzt eine plattformübergreifende App erstellen möchten, nichts falsch machen , wenn Sie von Anfang an mit Mono beginnen und diese als Framework verwenden. Sie können sogar Mono unter Windows bereitstellen, wenn Sie möchten.

Auf der anderen Seite, wenn Sie Sie suchen eine Windows - Anwendung heute auf den Aufbau , dass Sie denken vielleicht müssen an einem unbekannten Punkt sein Cross - Plattform in der Zukunft, möchten Sie wahrscheinlich mit den nativen Windows - Widgets und Tools gehen. .Net macht hier einen viel besseren Job als Java, und Mono ist in diesem Szenario ein durchaus akzeptabler Rückgriff.

Mit anderen Worten: Ja, .Net, wenn plattformübergreifend in jeder Hinsicht, die für Ihre Frage von Bedeutung ist. Nein, mit mono wird nicht jedes .NET-Programm sofort ausgeführt, sondern Ihre Frage bezieht sich auf ein neues Projekt. Es ist nicht sehr aufwändig, neue Projekte vor Problemen zu schützen und Kompatibilitätsprobleme zu vermeiden, insbesondere wenn Sie eher an die Entwicklung für Mono als an die Entwicklung für .NET denken.

Vor allem aber denke ich, dass dies in erster Linie die falsche Frage ist. Wenn Sie kein neues Entwicklerteam aufbauen, beginnen Sie mit Programmierern, die auf dem einen oder anderen Gebiet Erfahrung haben. Ihre besten Ergebnisse erzielen Sie mit dem, was Ihre Programmierer bereits wissen. So wichtig das Erstellen einer plattformübergreifenden App auch sein mag, wenn Sie ein Team von .NET-Programmierern mit wenig Java-Erfahrung haben, ist es unwahrscheinlich, dass Sie diese für Ihr nächstes Projekt starten oder alle dazu bringen, Java zu lernen. Wenn Sie ein Team mit Java-Programmierern haben, werden Sie sie nicht bitten, .NET für ein reines Windows-Projekt zu lernen. Beides wäre verrückt.

Joel Coehoorn
quelle
Nur um das "Open Source" -Problem zu klären: Ich habe mir vorgestellt, dass ein Open Source-Projekt nicht von einer geeigneten Geschäftseinheit unterstützt wird, und nicht von einem Unternehmen, das über einen GPL-Quellcode verfügt.
3
Novell ist keine „geeignete Geschäftseinheit“?
SVICK
@svick - Ich denke nicht, dass "suable" Tippfehler ist. Er ist besorgt über rechtliche Probleme, die die Unterstützer des Projekts betreffen.
Joel Coehoorn
@Thorbj Aus geschäftlicher Sicht ist es besser, eine starke unterstützende Entität wie Novell zu haben, als eine abstrakte Entität wie die JCP.
Joel Coehoorn
@ user8057 Ah, ich habe dieses Wort noch nie gehört. Es sah aus wie ein seltsamer Tippfehler.
SVICK
11

Ich habe mit Mono gearbeitet und ich würde sagen, dass es so gut ist, wie Sie es mit einer alternativen Plattform bekommen können, die Open Source ist und nicht direkt von Microsoft unterstützt wird. Wenn Sie mit einer alternativen Open-Source- Plattform wie Clojure oder Scala vertraut sind, könnten Sie wahrscheinlich mit Mono vertraut sein.

Die von Mono unterstützte .NET-Version finden Sie immer auf der Mono-Roadmap- Seite.

Funktionieren alle GUI-Elemente? Soweit ich weiß, tun sie das, obwohl ich nicht jedes Element ausführlich ausprobiert habe.

Ist Mono identisch mit .NET? Ich vermute, dass hier und da kleinere (und vielleicht größere) Anpassungen erforderlich sein werden. Sie können derzeit beispielsweise das Entity Framework nicht damit ausführen.

Robert Harvey
quelle
Natürlich ist Mono kein exakter Klon, aber meines Erachtens ist es eine sehr praktikable Option, wenn Sie neue Projekte starten.
ChaosPandion 20.11.10
Ist der Charakter in dir Bild? von 美国?
Jader Dias
1
@ Jader, völlig unabhängig - aber das ist das chinesische Schriftzeichen für schön und 美国 (wenn kombiniert bedeutet US, bedeutet auch wörtlich schönes Land)
aggietech
AFAIK Clojure und Scala sind Sprachen, keine Plattformen. Und (wieder AFAIK) Scala sollte auf jeder JVM-Implementierung ausgeführt werden, auf der Java ausgeführt werden kann.
Giorgio
9

Als Ziel bewegt sich das .NET / Mono-Universum sehr schnell .

Alle paar Jahre bringt Microsoft einige überzeugende Änderungen und Innovationen in Bezug auf Sprache, Laufzeit und Infrastruktur rund um .NET heraus. Zum Beispiel: Generics, LINQ, DLR, Entity Framework - Mit jeder neuen Version von Visual Studio werden der Funktionsumfang und die Nützlichkeit des Frameworks, auf das es abzielt, erheblich erweitert.

Die ständige Verbesserung des Frameworks ist zwar zu begrüßen, aber auch problematisch, wenn Sie Kompatibilität über mehrere Plattformen hinweg wünschen. Plattformen mit langfristiger Unterstützung wie Red Hat Enterprise Linux machen im Hinblick auf die Einführung neuer Technologien nur langsame Fortschritte, und zu jedem Zeitpunkt wird die Mono-Plattform erhebliche Verbesserungen aufweisen, die erst in den letzten Monaten eingetreten sind. Wenn Sie also die Dinge ausführen möchten, die die coolen Kids bauen, müssen Sie Mono von Grund auf kompilieren und Ihre eigenen Patches und Updates verwalten. Das ist nicht cool.

Java hingegen stagniert wie ein Kinderbecken. Gerade jetzt, da es sich um ein Unternehmen handelt, das Java nur für Patentstreitigkeiten einsetzen wollte, können Sie ziemlich sicher sein, dass es in absehbarer Zeit keine erkennbaren Änderungen in der Sprache oder Laufzeit geben wird. Java ist eine ebenso stabile Plattform wie FORTRAN. Das ist nicht so gut, wenn Sie auf Verbesserungen gehofft haben, aber nicht so schlecht, wenn Sie versuchen, eine Unternehmensanwendung bereitzustellen.

tylerl
quelle
Lustigerweise erwähnen Sie Fortran, da es sich ständig weiterentwickelt und dabei den Schwerpunkt auf Gleichzeitigkeit und Parallazetion sowie auf OOP-Prinzipien legt. Also ja, Fortran 77 ist stabil, aber seit Fortran 90 herausgekommen ist, wird jede Revision besser und besser. Fortran 2008 ist "fast" eine moderne Sprache.
ja72
4
Ich würde sagen, dass .Net / C # 1.0 bestenfalls ein schlechter Java-Klon war, aber mit .Net 2.0 gab es eine ziemlich gute Feature-Parität zwischen den beiden Plattformen. Von dort auf .NET 3.5 / C # 3 umgestiegen, hat die Microsoft-Plattform Java in den meisten Bereichen weit hinter sich gelassen und gewinnt mit neuen Funktionen wie dynamischem Tippen und kommenden Funktionen wie asynchroner Parallelität immer mehr an Boden. Ein wichtiger Grund dafür, dass .Net sich so schnell bewegen kann, ist die Spur, die Java hinterlassen hat. Wenn Oracle Java vorantreiben möchte, kann es dem ähnlichen Pfad, den Microsoft jetzt hinterlassen hat, schnell folgen.
Joel Coehoorn
msgstr "Das .NET / Mono - Universum bewegt sich sehr schnell". Ironischerweise ist der Hauptgrund, warum wir Mono nicht verwenden, dass die GC-Entwicklung unerträglich langsam war. Sie bezeichneten den derzeit stabilen GC als "vorläufige Maßnahme" im Jahr 2003! lists.ximian.com/pipermail/mono-gc-list/2003-August/000012.html
Jon Harrop
Oder Sie können einfach Debian / Ubuntu ausführen, einige externe apt-Repositorys verwenden und mit den coolen Kids spielen, ohne Mono von Grund auf neu kompilieren zu müssen.
Quandary
7

Aus der Sicht der Benutzer ist Mono nicht in der Lage, Windows .NET-Apps mit Linux kompatibel zu machen. Wenn Sie tatsächlich versuchen, eine anständig geschriebene Windows-App in Mono auszuführen, funktioniert dies nicht.

Aus der Sicht eines Paketierers (ich habe früher ein bisschen bei PortableApps gearbeitet) kann .NET sowohl ein Segen als auch ein Fluch sein. Wenn Sie nur unter Windows arbeiten, erleichtert .NET die Bereitstellung erheblich, da mehr Bibliotheken weniger systemabhängige Dinge bedeuten (insbesondere zwischen Windows-Versionen, glaube ich), aber auch unter Windows äußerst verwirrend ist, da .NET-Versionen nicht rückwärts sind -kompatibel oder vorwärtskompatibel. Sie müssen verschiedene Versionen von .NET für verschiedene Programme herunterladen.

Trotzdem ist Mono ein guter Ausgangspunkt, um C # -Programme plattformübergreifend zu gestalten. Packen Sie das Programm einfach nicht mit dem neuesten WINE und rufen Sie es trotzdem als erledigt auf. Schauen Sie, wohin das Picasa geführt hat.

Wie bei der politischen Stabilität der beiden Sprachen / Plattformen würde RMS wahrscheinlich anfangen, darüber zu schwärmen, wie Mono von Novell geleitet wird, dessen Flitterwochen mit Microsoft ziemlich berüchtigt sind. Beide Plattformen können derzeit als politisch instabil eingestuft werden.

Wenn Sie wirklich einfach plattformübergreifend arbeiten möchten, ist der bewährte Weg QT, der politisch recht stabil ist, und zwar: das verkauft wirklich sehr, sehr beliebte Handys.

digitxp
quelle
5
Wie schnell sich die Dinge ändern. Nokia verkauft keine Telefone mehr, die die Leute wollen, und Novell existiert nicht mehr, da sowohl Qt als auch Monos Zukunft zweifelhaft sind. Dies ist wahrscheinlich der Grund, warum Unternehmen nichts anderes als "primär unterstützte" Systeme wie Microsoft verwenden. Deshalb ist Open Source so eine gute Idee.
gbjbaanb
4

Mono ist kein 1: 1-Port von Microsoft .net. Es gibt Technologien, die von Mono einfach nicht implementiert werden oder nicht geplant sind (z. B. Workflow Foundation oder WPF ), während Microsoft .NET einige eigene Technologien verwendet, z. B. SIMD-Erweiterungen .

Kurzantwort: Mono und Microsoft .NET basieren auf derselben zugrunde liegenden Grundlage - CIL und BCL -, sind jedoch separate Projekte.

Michael Stum
quelle
2

Kleiner Kommentar zu den Aussagen im Originalbeitrag. Ich werde argumentieren, dass das TCK ein theoretisches Tool bleibt, mit dem Oracle behaupten kann, Java sei ein offener Standard. Wenn Sie bemerken, dass Apache Harmony seit einigen Jahren erfolglos versucht, sich als "Java" zertifizieren zu lassen. Es ist klar, dass Oracle wirklich kein Interesse an einer Open-Source-Implementierung hat, abgesehen von der, mit der sie verbunden sind, und mehr oder weniger Kontrolle (OpenJDK), was übrigens auch so ist. Ähnlich wie Mono ist es nicht vollständig (dh keine Java Web Start-Unterstützung) und es fehlen einige Optimierungen, die in der Closed-Source-HotSpot-Implementierung verfügbar sind.

Also wohl ab 2010; (die meisten) Java ist Open Source, aber kein offener Standard, während (die meisten) .NET kein Open Source, sondern ein offener Standard ist. Es gibt natürlich Ausnahmen, das DLR, IronPython, IronRuby und F # sind tatsächlich Open Source. Mono ist interessant, weil es das Beste aus beiden Welten bietet, Open Source-Implementierungen von offenen Standards.

Casper Bang
quelle
Die Offenheit von Java ist als solches kein wichtiger Bestandteil. Es ist meine Erfahrung, dass meine Programme auf den JVMs, die die TCK bestanden haben, gut laufen, so dass dies ein wichtiger Parameter ist.
1

Abgesehen von allen technischen Details spielt das Schreiben des Codes eine wichtige Rolle.

Wie bei jeder plattformübergreifenden Technologie (sei es Java, Python, Ruby ...) sollten Sie davon ausgehen, dass der Code mit einer Wahrscheinlichkeit von grundsätzlich Null ordnungsgemäß ausgeführt wird, auch wenn dies der Fall ist, wenn der Code nicht portabel geschrieben wurde in der Realität viel, viel höher), da das seltsame Fehlverhalten durchaus kritisch sein könnte. Lesen Sie: Nehmen Sie nicht die zufällige Assembly und führen Sie sie unter Mono aus.

Für ein neues Projekt (oder ein Projekt, das Sie problemlos umgestalten können) ist die Auswahl von .Net / Mono als potenziell portable Laufzeit sinnvoll. Sie sparen sich jedoch eine Menge Ärger, wenn Sie Ihren Code sehr früh auf Mono testen, auch wenn das Projekt dies bereits getan hat nur eine geringfügige Änderung der Multiplattform. Wenn Sie einen Continuous Integration Server verwenden, kann dies so einfach sein wie das Einrichten eines Mono-Build-Knotens. Viele Probleme können während der Entwicklung gelöst werden, indem Sie sich daran gewöhnen (wie das Erstellen von Pfadzeichenfolgen), und ein großer Teil Ihres Codes kann auf Mono portabel und Unit-getestet werden, indem Sie vernünftige Methoden und ein wenig Voraussicht anwenden. Der Rest (dh fehlgeschlagene Komponententests) ist dann plattformspezifisch (wie Code mit PInvoke), sollte jedoch ausreichend gekapselt sein, um eine alternative Implementierung pro Zielplattform bereitzustellen.

Die Verwendung einer Bibliothek, die in Mono nicht verfügbar (.Net) oder kompatibel (von Drittanbietern) ist, schließt dies natürlich aus, aber in meinem Bereich muss dies noch gesehen werden. Das ist die Strategie, die wir bei der Arbeit anwenden, und bei der Anwendung habe ich keine Angst davor, zu behaupten, dass .Net + Mono plattformübergreifend ist.

Lloeki
quelle
0

Es variiert, lautet die ehrliche Antwort. Ich habe kleine Webserver gesehen, die von IIS zu Apache verschoben wurden und unter Mono fast ohne Schwierigkeiten liefen. Ich habe unveränderte Windows .Net-Anwendungen mit Win Forms unter Linux erfolgreich ausgeführt.

Wenn Sie jedoch einen API-Aufruf verwenden, der nicht in Mono implementiert ist, funktioniert dies möglicherweise nicht. Die einzige Lösung besteht darin, Ihre Anwendung neu zu schreiben, sich an Windows zu halten oder die zusätzlichen Informationen in Mono zu schreiben.

Michael Shaw
quelle