Frage

Ich habe C # in Visual Studio .NET verwendet, und ich habe um ein wenig mit Mono auf openSUSE Linux gespielt, aber ich weiß nicht wirklich verstehen, wie es funktioniert.

Wenn ich eine App in Windows auf .NET schreiben, in welcher Beziehung steht dies auf Mono? Ich kann nicht einfach ausführen ein Windows auf Linux ohne Wein-Datei .exe, so dass es hilft mir nicht apps in Windows entwickelt auszuführen.

Ist der Zweck rein eine .NET-Bibliothek äquivalent auf Linux zu haben (und andere) Cross-Plattform-Entwicklung zu erleichtern? wenn ich ein Geschäft zum Beispiel war und wollte Linux-Kunden erreichen, aber wirklich wollte .NET verwenden, dann soll Mono meine Wahl? Oder gibt es etwas mehr, dass ich fehle?

War es hilfreich?

Lösung

Ein Windows-EXE enthält mehrere "Teile". Vereinfacht , der .net-Code (= MSIL) ist nur ein Teil der EXE, und es gibt auch einen „echten“ native Windows-Teil im Innern des EXE, die für die .net als eine Art Trägerrakete dient Rahmen, die dann die MSIL ausgeführt wird.

Mono nehmen nur die MSIL und führen Sie es aus, die native Windows-Launcher Sachen zu ignorieren.

Auch dies ist eine vereinfachte Übersicht.

Edit: fürchte ich mein Verständnis der tief tief Details ist nicht gut genug für wirklich viel Detail (ich weiß in etwa, was ein PE-Header ist, aber nicht wirklich die Details), aber ich fand diese Links hilfreich:

NET Baugruppenstruktur - Teil II

.NET Foundations - .NET-Assembly-Struktur

Andere Tipps

Dies ist eine alte Frage (mit einer bereits ausgewählten Antwort), aber ich glaube nicht, die Frage wirklich gut beantwortet wurde.

Zuerst ein wenig Hintergrund ...

Wie funktioniert .NET Arbeit?

Eine traditionelle Windows-EXE-Datei ist eine binäre Datei, die eine Reihe von Maschinensprache-Anweisungen darstellt, die Ihr Computer versteht und das macht Anrufe in den Win32-API, die Teile von Windows sind, die Dienste liefern, die Anwendungen nutzen können. Die Maschine verwendete Sprache ist sehr spezifisch für Ihre Art von Computer und die Win32 ruft die ausführbaren sehr abhängig von Windows-machen. Eine .NET ausführbare Datei ist, dass nicht wie.

Es ist wichtig zu erkennen, dass eine .NET ausführbare Datei (EXE-Datei) ist nicht wirklich eine native Windows-Anwendung. Windows selbst versteht nicht, wie Sie den Code in einer .NET-Datei auszuführen. Ihr Computer nicht versteht es nicht.

Ähnlich wie Java, eine .NET-Anwendung besteht aus Anweisungen in einer Sprache namens CIL (Common Intermediate Language) aus, die Sie als Maschinensprache für ein idealisiertes Computer denken können, die nicht wirklich existiert. In .NET ist die Software-Implementierung dieser idealisierten Maschine der Common Language Runtime (CLR) genannt. Das Äquivalent in der Java-Welt ist die Java Virtual Machine (JVM) bezeichnet. In Java ist das Äquivalent zu CIL Java-Bytecode genannt. CIL wird manchmal MSIL (Microsoft Intermediate Language) genannt.

CIL ist so konzipiert, auf der CLR (eine idealisierte Maschine) laufen, aber ansonsten ist plattformunabhängig, was bedeutet, dass der CIL kümmert sich nicht darum, welche Art von Computer Sie haben oder welches Betriebssystem Sie ausgeführt werden.

So wie Sie auf jeder Plattform eine native Version der Java JVM brauchen, auf dem Sie Java ausführen möchten, müssen Sie eine native Version der CLR .NET CIL Executables auszuführen. Die CLR ist eine native Windows-Anwendung ebenso wie die traditionellen Win32 EXE-Dateien oben beschrieben. Die CLR selbst ist spezifisch für die Windows-Implementierung und Computer-Architektur, auf das es entworfen wurde, ausgeführt werden.

Es ist egal, welche .NET-Sprache, die Sie beginnen mit (C #, Visualbasic, F #, Ironpython, IronRuby, Boo, etc.), alles, was sie zu CIL Bytecode erhalten zusammengestellt nach unten. Sie können ganz einfach „zerlegen“, um ein CIL-Programm in eine Form der objektorientierten Assemblersprache, die die Menschen durch leicht lesbar ist. Sie können ein Programm in CIL direkt selbst aber nur wenige Leute schreiben zu tun.

Unter Windows erstellt die CLR diesen CIL-Code Just-in-Time (JIT) Recht, wenn Sie die ausführbare Datei ausführen - kurz bevor der Code tatsächlich ausgeführt wird. Dies bedeutet, dass der CIL Bytecode (kompiliert) zu tatsächlichem Maschinencode umgewandelt, die nativ auf Ihrem Computer ausgeführt wird. Dieser Teil der CLR wird die JIT-Compiler oder oft nur die JIT genannt.

Bisher hat Microsoft vier Versionen der CLR-Freigabe: 1.0, 1.1, 2.0 und 4.0. Sie müssen die richtige Version der CLR auf Ihrem Rechner installiert haben, wenn Sie .NET ausführbare Dateien ausgeführt werden soll, dass die Laufzeit-Targeting. Die CLR 2.0 unterstützt .NET 2.0, 3.0 und 3.5-Anwendungen. Für andere Versionen von .NET bildet die .NET-Version sauber auf die CLR-Version.

Neben der JIT / CLR, bietet .NET eine Vielzahl von Bibliotheken (Baugruppen), die den Rest des .NET-Frameworks bilden und dass eine Vielzahl von Funktionen und Diensten bereitstellen, die .NET-Anwendungen können rufen. Die große Mehrheit dieser Baugruppen sind reiner CIL-Code, der auf der CLR ausgeführt wird. Unter Windows ein einige Anrufe tätigen in die Win32-API als auch. Wenn Sie .NET installieren, installieren Sie die CLR, die Klassenbibliotheken (Rahmen), und eine Reihe von Entwicklungstools. Jede Version der CLR erfordert in der Regel einen kompletten Satz dieser „Rahmen“ Baugruppen. Einige Versionen von .NET (zB. 3.0 und 3.5) hinzugefügt, um zusätzliche Rahmenbaugruppen, ohne dass die CLR zu aktualisieren oder die vorhandenen Baugruppen mit dem CLR verbunden.

Das Portable Executable (PE) Dateiformat, das eine Windows-EXE-Datei in geliefert wird, enthält einen Kopfer beschreibt, dass die ausführbare Datei und identifiziert die Datei als .NET-Datei oder eine native Win32-Datei. Wenn Windows versucht, eine .NET-Datei auszuführen, sieht es diesen Header und ruft automatisch die CLR in Ihrem Namen. Aus diesem Grunde .NET EXE-Dateien erscheinen nativ auf Windows ausgeführt werden.

Ok, so wie funktioniert Mono Arbeit?

Mono implementiert die CLR auf Linux, Mac und anderen Plattformen. Die Mono-Laufzeit (CLR) ist eine native Anwendung geschrieben meist in der Sprache C, und in Maschinensprache-Code für das Computersystem, auf das laufen soll zusammengestellt unten. Wie bei Windows ist die Mono-Laufzeit spezifisch für das Betriebssystem und die Art der Maschine, die Sie verwenden.

Genau wie unter Windows, die Mono-Laufzeit (CLR) kompiliert den CIL-Bytecode in Ihrem .NET ausführbaren Just-in-time zu nativen Code, der der Computer verstehen und auszuführen. Auf diese Weise ist eine .NET-Datei nur als „native“ zu Linux, wie es zu Windows ist.

Um den Port Mono auf eine neue Architektur, die Sie den JIT / CLR-Anschluss benötigen. Das ist wie jede native Anwendung auf eine neue Plattform zu portieren.

Wie gut .NET-Code läuft auf Linux oder Mac ist wirklich nur eine Frage, wie gut die CLR auf diesen Systemen implementiert sind. Theoretisch .NET-Code auf diesen Systemen viel besser als die MS-Version von .NET funktioniert unter Windows ausführen die Mono CLR könnte. In der Praxis ist die MS Implementierung im Allgemeinen überlegen (wenn auch nicht in allen Fällen).

Neben der CLR, Mono meisten des Restes der Bibliotheken (Baugruppen) bereitstellt, die das .NET Framework bilden. Genau wie bei der Microsoft .NET-Version (in der Tat mehr so) die Mono-Baugruppen sind als CIL Bytecode zur Verfügung gestellt. Dies macht es möglich, eine * .dll oder * .exe-Datei von Mono zu nehmen und es unmodifizierten auf Windows, Mac ausführen oder Linux als CIL die „native“ Sprache der CLR-Implementierungen auf diesen Systemen ist.

Genau wie unter Windows, Mono mehrere Versionen der CLR und die zugehörigen Baugruppen unterstützt:

Sehr frühe Versionen von Mono (vor 1.2?) Nur unterstützt CLR 1.0 oder 1.1. Mono nicht große Brocken des 2.0-Framework unterstützen, bis sie eigene Version 2.0 ist.

Mono-Versionen bis Version 2.4 unterstützt sowohl CLR 1.1 und CLR-2.0-Anwendungen.

Beginnend mit Mono 2.6, CLR 4.0 hinzugefügt wurde, aber CLR 2.0 war noch die Standardeinstellung.

Beginnend mit Mono 2.8 der CLR 4.0 der Standard wurde und die CLR 1.1 nicht mehr unterstützt wird.

Mono 2.10 setzt die CLR 4.0 als Standard zu verwenden und auch die CLR 2.0 zu unterstützen.

Genau wie die reale .NET (aber in weit weniger Fällen) gibt es einige Mono-Baugruppen, die in nativen Bibliotheken nennen. Um die System.Drawing Montagearbeiten auf Mono zu machen, schrieb das Mono-Team ein Linux-Programm, um den GDI + Teil der Win32-API unter Linux zu simulieren. Diese Bibliothek wird ‚libgdiplus‘ genannt. Wenn Sie Mono von der Quelle kompilieren, werden Sie feststellen, dass Sie benötigen diese ‚libgdiplus‘ Datei erstellen, bevor Sie ‚Mono‘ bauen. Sie brauchen nicht ‚libgdiplus‘ unter Windows, da die GDI + Teil der Win32-API bereits Bestandteil von Windows ist. Ein vollständiger Anschluss von Mono auf neue Plattformen erfordert diese ‚libgdiplus‘ Bibliothek als auch portiert werden.

In Bereichen, in denen das Design der .NET-Bibliothek übermäßig durch das Design von Windows und eine schlechte Passform für Systeme wie Mac oder Linux beeinflusst wird, hat sich die Mono-Team Erweiterungen des .NET-Framework geschrieben. Die Mono-Erweiterungen sind auch nur CIL-Bytecode und im Allgemeinen gut funktionieren auf .NET.

Im Gegensatz zu Windows, Linux in der Regel nicht .NET ausführbare Dateien erkennen und die CLR standardmäßig starten. Der Benutzer muss in der Regel die CLR direkt durch Eingabe ‚mono appname.exe‘ oder etwas ähnliches laufen. Hier ‚Mono‘ ist die Anwendung, die die CLR und ‚appname.exe‘ implementiert, wird die EXE-Datei, die auf .NET-Code enthält ausgeführt werden.

Um die Dinge einfacher für die Benutzer, Mono-Anwendungen werden häufig in einem Shell-Skript eingewickelt zu machen, der den CLR startet. Dies verbirgt sich die Tatsache, dass die CLR verwendet wird wie inFenster. Es ist auch möglich, Linux zu sagen, die CLR zu starten, wenn eine Datei mit dem PE-Dateiformat angetroffen wird. Dies wird in der Regel nicht durchgeführt, wie das PE-Datei-Format auch für native Win32 ausführbare Windows-Dateien verwendet wird, das natürlich die CLR (Mono) nicht unterstützt.

Es gibt keinen technischen Grund ist, warum ein PE-Launcher konnte nicht von Linux verwendet werden, die dann entweder ein System startet, die native Windows-Code versteht (wie Wein) oder die CLR (Mono) als angemessen. Das hat einfach nicht mein Wissen geschehen war.

Hin und her

Jeder, der .NET-Code-Sticks auf „fully managed“ Code, was bedeutet, es nicht in non-.NET Code aufgerufen, sollte auf Mono auf allen Plattformen funktionieren. Ich routinemäßig .NET-Assemblies aus dem Windows kompiliert verwenden (für die ich habe den Code nicht) unter Linux und Mac.

Ich kann auch keinen Code übernehmen, die mich auf Mono zu kompilieren und unter Windows auf .NET laufen. Ich kann ein Kunde einen Code liefere ich mit Mono kompiliert und keine Sorgen, wenn er auf 32-Bit- oder 64-Bit-Windows zum Beispiel ist. Der Kunde muss die richtige Version von .NET (die rechte CLR) fo natürlich installiert sein. CLR 2.0 hat sich für eine sehr lange Zeit, und Sie können fast alle Windows-Anwender setzen es installiert haben. Die Mono-Compiler und andere Code sind auch nur ausführbare Dateien CIL und so laufen sie gut auf Windows, wenn Sie möchten.

(Zu tun, wo legal) von der tatsächlichen MS-Version von .NET und laufen auf Mac oder Linux

Mono-Kompatibilität ist gut genug, dass große Teile des eigentlichen Code Microsoft, wie ASP.NET MVC können, genommen werden. Im allgemeinen hat das Mono-Team eine große Aufgabe der Umsetzung getan, sowohl die CLR und den Rest des Rahmens (Klassenbibliotheken / Baugruppen).

ASP.NET

Unter Windows wird die Internet Information Server (IIS) weiß, wie in den CLR nennen .NET als Teil einer Web-Anwendung auszuführen. Unter Linux / Mac gibt es ein Apache-Modul (mod_mono), die ähnliche Funktionen an den Apache-Webserver zur Verfügung stellt. Diese Anwendung ist in C geschrieben und muss auch auf neue Architekturen portiert werden.

Portierungs Mono

Diese Diskussion hat Teile Mono identifiziert, die als „native“ ausführbaren Dateien erstellt werden und muss auf einem System vorhanden sind, auf dem .NET-Anwendungen ausgeführt werden soll.

  • Die CLR (einschließlich JIT-Compiler) - in der Regel als Mono
  • bekannt
  • libgdiplus (für Systeme, die das GDI + API [nur Windows-tut] nicht nativ unterstützt)
  • mod_mono (damit Apache die CLR für .NET-Web-Anwendungen aufrufen)

Diese drei Komponenten, mit dem Zusatz der Klassenbibliotheken, eine .NET-Umgebung bereitzustellen, die „native“ auf die .NET ausführbaren Dateien, die Sie ausführen müssen aussieht.

Das ist, wie Mono funktioniert.

Sie können in der Tat eine .NET-EXE-Datei mit Mono unter Linux laufen. Dies gilt nicht Wein erfordern. In der Tat stellt Mono-Programme Dateien .exe, die entweder mit Mono unter Linux oder als ausführbare unter Windows ausgeführt werden kann.

Mono ist eine Open-Source-Implementierung von Microsofts .NET-CLR (Common Language Runtime). Dies ist, was Teil von .NET-Programmen läuft, die nicht in nativen Code, sondern in CIL (Common Intermediate Language), eine Sprache und Maschinenneutrale Zwischensprache. Die Laufzeit nimmt das Zwischencode und übersetzt sie in Maschinencode.

Bei dem aktuellen Stand der Mono können Sie .NET-Programme übernehmen, die die wichtigsten Teile von .NET verwenden (mscorlib.dll) und führen sie überall Mono läuft, nicht nur Sie Windows.

Aber wie erwähnt, dass Mono Open Source ist und man kann nicht einfach verlassen, dass es die vollständige .NET-Implementierung sein wird, hat es einige Steuerelemente, die nicht berufstätig sind, müssen Sie auch vorsichtig sein mit P / Ruft, dass Ihr Anwendung verwenden, zB für Ihre Anwendung mit MCI (Multimedia Controller Interface) unter win32 kommunizieren. Aber ich war auch mono Schreiben GTK # Anwendungen, aber ich habe auch meine Windows-Anwendungen, die ohne erneute Kompilierung arbeitete als unsere Kolleginnen und Programmierer oben erwähnt, das heißt, Mono ist eine Open-Source-Alternative von Microsoft .NET und standardmäßig, wenn Sie bauen entweder WinForms oder Gtk # -Anwendungen Mono kompiliert und eine EXE-Baugruppe für jede Datei, und natürlich erstellen, wenn Sie wollen, es wird ein Dynamic Link Library (DLL) erstellen, fast wie es in .NET getan. Just for Vorschlag versuchen, einige Gtk # zu schreiben (mit MonoDevelop-IDE, die hat seine integrierte GUI-Designer namens stetic). Und natürlich kann mono ein guter Ersatz für Web Services sein, dass Sie sie auf .NET erstellen können, und Sie können sie auf Apache-Host (weil Linux sind heute billiger als Windows-diejenigen Hosting) Web Services und andere asp.net Anwendungen funktionieren unter apache mit einem mod_mono-Modul, das in apache enthalten sein müssen.

Ein wenig aus Thema, aber ich wollte nur sagen Ihnen einen kleinen Vorge-peek aus meiner Erfahrung.

Sie können auch einen Blick auf MoMA nehmen (wenn Ihr Ziel-Port-Anwendungen von Win Lin ist).

  

Die Mono Migration Analyzer (MoMA)   Tool hilft Ihnen, Probleme zu identifizieren, Sie können   haben, wenn die Portierung Ihrer .Net   Anwendung auf Mono. Es hilft lokalisieren   Plattform bestimmte Anrufe (P / Invoke), und   Bereiche, die noch nicht unterstützt werden durch   das Mono-Projekt.

MoMA

Hier ist ein Webapp, die die Typen des BCL vergleicht bereits implementiert von Mono und .NET Framework 3.5

http://mono.ximian.com/class -status / 2.0-vs-3.5 / index.html

Michaels Antwort auf eine weitere, ich glaube, Sie werden auf Mono für die App neu kompilieren auf der Mono-Laufzeit laufen. Ausnahmen bestehen können. Ich habe nur um mit Mono nur ein bisschen gespielt, und ich habe immer die Quelle neu kompiliert. Ich habe noch nie eine .NET-Anwendung laufen direkt auf Mono versucht.

Auch Mono 1.9 soll vollständig kompatibel .NET 2.0 sein. Mono Olive und Moonlight sollen .NET 3.0 (weniger WPF) und Silverlight-Funktionen hinzuzufügen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top