.Net: Grundlegendes



  • Hallo Forum.

    ich habe bis jetzt Programme mit MFC geschrieben.

    Jetzt möchte ich aber in .Net einsteigen und Programme mit dem .Net Framework erstellen.

    Leider habe ich NULL ahnung von .Net.
    Könntet ihr mir die Grundlagen und Grundlegenden Begriffe von .Net erklären bzw. brauchbare Links zum Thema posten?
    Buchempfehlungen sind auch erwünscht.



  • Ok.

    .NET ist ein Framework ähnlich der JVM für Java. .NET-Programme liegen in einer Art Zwischencode vor, genannt MSIL oder CIL. Der ist im Prinzip äquivalent zum Bytecode bei Java, nur ist es halt ein Zwischencode für die .NET-Laufzeitumgebung und nicht für die JVM. Die .NET-Laufzeitumgebung wird benötigt, um ein .NET-Programm auf einem Rechner laufen zu lassen. Ohne läuft garnichts.

    DIE Sprache für .NET ist C#, auch wenn .NET "Sprachunabhängig" sein soll. Es gibt also auch Compiler, die Quellcode von anderen Sprachen in CIL umwandeln. Allerdings gibt es hier natürlich diverse Einschränkungen.

    Es gibt Versuche, das .NET-Framework auf andere Plattformen neben Windows zu portieren, wie zum Beispiel das MONO-Projekt. Bisher sind diese Versuche allerdings nicht zu einem erfolgreichen Abschluss gekommen, wenn dies aber irgendwann mal passieren sollte, dann könnte ein .NET-Programm auch auf einigen anderen Plattformen wie z.B. Linux laufen.

    Die Portierungsversuche sind nicht ganz leicht, da nur ein Teil des .NET-Frameworks (z.B. bei der ECMA) standardisiert ist und MS zumindest keine freien Portierungen unterstützt. Zum Beispiel sind in dem .NET-Standard keine WinForms enthalten, die bei der Entwicklung von GUIs wohl eine stärkere Rolle spielen.

    C# als Sprache ist wohl leichter als C++, weniger fehleranfällig und leichter wartbar. Zudem ist die Standardbibliothek deutlich umfassender. Gegenüber Java liegen diese Vorteile allerdings nicht vor, da sich C# und Java bis auf einige Details sehr ähneln. Wenn man die Sprachen isoliert betrachtet, hat hier weder Java noch C# einen deutlichen Vorteil. Allerdings bietet C++ gegenüber beiden Sprachen eine deutlich höhere Ausdrucksfähigkeit, da einfach mehr Sprachmittel zur Verfügung stehen, wie z.B. Templates. C++ ist zudem eine "Multiparadigmensprache", die objektorientierte Programmierung, generische Programmierung und prozedurale Programmierung unterstützt. Dadurch ist sie vielseitig einsetzbar. C# und Java unterstützen hingegen nur die objektorientierte Programmierung. Das Anwendungsgebiet von C++ ist zudem größer als das von C# oder Java, da man "systemnah" programmieren kann und die Programme i.d.R. ein ganzes Stückchen schneller ablaufen (Faktor 2-4). C#-Programme (und Java-Programme) laufen zwar nicht ganz so schnell wie C++-Programme ab, bieten dafür aber diverse Sicherheitsmechanismen, wie z.B. Bereichsprüfungen (für Arrays),...! Zudem ist hier der Umgang mit Speicher etwas leichter, da die Speicherfreigabe größtenteils von einem GC (GarbageCollector) automatisch durchgeführt wird.

    .NET ist noch relativ neu (1,5 Jahre). Viele (auch Windows-Nutzer) haben deshalb wohl noch keine .NET-Laufzeitumgebung. Ich weiß nicht, inwiefern es solche Laufzeitumgebungen für ältere Windows-Versionen gibt. Für Win95 gibt es wohl keine, bei Win98 weiß ich das nicht, vermute aber, dass auch hier keine Unterstützung vorliegt.

    So, jetzt sag mal genauer, was du eigentlich wissen möchtest. Ich glaube, ich erzähle dir hier etwas, was dich garnicht interessiert.



  • Danke für diesen Überblick.

    Lohnt es sich neben MFC, noch die Programmierung mit dem .Net Framework zu lernen?
    Ich habe gehört, dass .Net speziell verteilte Anwendungen bzw. Webservices "unterstützt". Inwiefern?

    Gibt es ein gutes, empfehlenswertes Buch zur Programmierung mit dem .NET Framework in C++ bzw. C#.

    EDIT: Doch ht mich schon interessiert.



  • Zu MFC und .NET:
    Verwendet man die neue Microsoft-Plattform .NET, so lernt man zahlreiche neue Begriffe, das Thema MFC wird jedoch nur am Rande erwähnt. Von daher ist die Frage nach der Zukunft der MFC-Programmierung berechtigt. Für die Windows-Programmierung mit C++ und MFC stellt Micossoft als modernstes Werkzeug das neue Visual Studio .NET zur Verfügung. Das darin enthaltene Visual C++ 7.x bietet mit einer geringfügig erweiterten MFC-Version 7.x eine gute Ausgangsbasis für die Erstellung performanter Windowsprogramme auf der Basis des Betriebssystems Windows. Hiermit wird nach wie vor Maschinencode erzeugt. Um es klarer zu sagen: Man kann mit diesem modernisiserten und erweiterten Tool weiter machen wie bisher und .NET völlig ignorieren. Das nennt man neuerdings „unmanaged code“.

    Zu .NET allgemein:
    Microssoft .net crashkurs, MS Press, 2. Auflage.
    3-86063-519-0 24,90 Euro

    zu C#:
    Im Zusammenhang mit der Plattform .NET bietet Microsoft den Softwareentwicklern eine neue Programmiersprache namens C# (gesprochen „C sharp“) an. Man fragt sich sofort, ob es unbedingt einer neuen Programmiersprache bedurft hätte. Gerade als C++-Programmierer möchte man die gewohnte Sprache mit ihren umfassenden Möglichkeiten weiter nutzen. C# wird von Microsoft als überlegene systemeigene Sprache für die .NET Common Language Runtime (CLR) angepriesen. Geradezu nahtlos soll sich diese neue Sprache in die .NET-Laufzeitumgebung einfügen, während C++ zum geduldeten Stiefkind verkommt. Eine schwierige Situation. Die CLR wird als sogenannte komponentenorientierte Umgebung gesehen. C# ist daher eine komponentenorientierte Programmiersprache. Hier bahnt sich ein Paradigmenwechsel vom Objekt zur Komponente an.

    Als Praktiker werfen wir sofort einen Blick auf die neue Programmiersprache C#. Wenn kein Visual Studio .NET zur Verfügung steht, kann man für erste Experimente die kostenlose GNU-Software SharpDevelop einsetzen.

    using System;
    
    class Hallo
    {
        public static void Main()
        {
            Console.WriteLine("C# sagt nun auch Hallo.");
        }
    }
    

    Als Ausgabe erscheint die gewohnte Konsole. Man erkennt sofort die Nähe zur Programmiersprache Java. Die Einstiegsfunktion Main() muss innerhalb einer Klasse aufgerufen werden.

    Ausnahmebehandlung mit try und catch spielt bei C# und .NET eine zentrale Rolle. Anstelle einer Fehlerrückgabe wird konsequent die Ausnahmebehandlung verwendet. Die folgende Codesequenz zeigt die Ausnahmebehandlung mit try und catch, die C++-Programmierern bereits bekannt ist:

    using System;
    
    class Test
    {
    	static int z = 0;
    
        public static void Main()
        {
            try
            {
                Console.WriteLine("Wir befinden uns im try-Block\n");
                int zahl1 = 1;
                int zahl2 = zahl1 / z;
            }
    
            catch (Exception e)
            {
                Console.WriteLine("Wir befinden uns im catch-Block\n");
                Console.WriteLine("Ausnahme: " + e.Message + "\n");
            }
            Console.WriteLine("Wir befinden uns nach dem catch-Block\n");
        }
    }
    

    C# ist abhängig von der Plattform .NET. Wenn man ein Programm, das aus einem C#-Sourcecode erzeugt wurde, auf einem Rechner ohne .NET ausführen möchte, erhält man folgende Fehlermeldung:

    "... MSCOREE.DLL wurde nicht gefunden."

    Diese DLL ist also eine zentrale Datei der .NET-Plattform, und die mit C# erzeugten exe-Dateien benötigen die .NET-Plattform zur Ausführung. Damit können solche Programme aber auch auf allen Systemen laufen, die diese Plattform anbieten.
    Klassen spielen in C# eine entscheidende Rolle. Das kennen wir bereits aus objektorientierten Sprachen wie C++ oder Java. Die Erzeugung eines Objektes a der Klasse A erfolgt bei C# in der aus Java bekannten Syntax. Im C#-Code existieren keine Abhängigkeiten von der Reihenfolge. Es werden auch keine Vorwärtsdeklarationen benötigt. Die Klasse A kann somit nach ihrem Auftauchen im Sourcecode definiert werden:

    using System;
    
    class Test
    {	
        public static void Main()
        {
            A a = new A(); // Objekterzeugung
    
            try
            {
                int zahl = 1 / a.GetZahl();
            }
    
            catch (Exception e)
            {
                Console.WriteLine("Ausnahme: " + e.Message + "\n");
            }
        }
    }
    
    class A
    {
        int z = 0;	
        public int GetZahl() {return(z);}
    }
    

    Eine MessageBox mit dem Text „Hallo“ und der Überschrift „Info“ gibt dieses C#-Programm aus:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    public class HalloWelt
    {
      public static void Main()
      {
        MessageBox.Show(
            "Hallo","Info",MessageBoxButtons.OK, MessageBoxIcon.Information);
      }
    }
    

    Hier wird die Klasse System.Windows.Forms.MessageBox und ihre statische Member-Funktion Show(…) verwendet, um diese MessageBox auszugeben. Das Package System.Windows.Forms bietet hier die grundlegenden Fensterklassen und -funktionen an. Will man ein einfaches Fenster ausgeben, so verwendet man z.B. folgenden Code:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    public class Fenster
    {
      public static void Main()
      {
        Form MeinFenster = new Form();
    
        MeinFenster.Width = 300;
        MeinFenster.Height = 50;
        MeinFenster.Text = "Ich bin ein Fenster";
    
        Application.Run(MeinFenster);
      }
    }
    

    Interessant ist, dass man unter Verwendung von System.Runtime.InteropServices noch auf Funktionen der WinAPI zurück greifen kann. WinAPI lebt also noch weiter! Es folgt ein einfaches Beispiel:

    using System.Runtime.InteropServices;
    
    class PInvokeTest 
    {
      [DllImport("user32.dll")]
      static extern int MessageBoxA(int hWnd, string m, string c, int t); 
      static void Main() 
      {
          MessageBoxA(0, "WinAPI lebt noch!", 
                      "Gruß aus der user32.dll", 0);
      }
    }
    

    ---Hinweis: es gibt auch Codetags für C# über cs und /cs Marc++us



  • Der Thread ist ja richtig was für die FAQ... noch eine Anmerkung zur Sprache, unter der man .NET programmiert:

    😉 managed C++
    😉 VB.net
    😉 C#

    mC++ unterscheidet sich relativ stark von C++, da es eine Garbage-Collection gibt (also unterscheidet sich das Destruktor-Verhalten) und man weder Templates noch die STL benutzen kann. D.h. man erzeugt sehr spezifische Quelltexte.

    VB.net übernimmt den Syntax von VB, ist aber natürlich auch in vielen Punkten anders - ein VB6-Programm läßt sich nicht einfach nach VB.net übersetzen. Diese Variante ist in erster Linie ein Tribut an die VB-Programmierer und soll uns daher hier nicht weiter interessieren.

    C# ist die Zielsprache von .net, d.h. sämtliche Beispielcodes zur .net-Bibliothek sind in C#, sowie Teile von .net ebenfalls, und außerdem sind die Sprachfähigkeiten exakt an die Elemente der .net-VM angepasst. Es ist also die naheliegende Wahl für .net.

    Und jetzt kommt noch etwas hinzu: die wichtigen WinForms für die GUI kann man unter jeder Sprache von .net nutzen, aber der Formdesigner unterstützt bisher nur C# und VB.net. Mit mC++ kann man also keine Forms mit dem Formdesigner erstellen, sondern muß das von Hand machen. Damit wird eigentlich der Sinn der Existenz von mC++ ziemlich ad absurdum geführt.

    Ein ganz wichtiger Hinweis bzgl. der Performance: es gibt unter C#, mC++ und VB.net keinerlei Performanceunterschiede mehr, die in der Sprache begründet sind. Der Pseudo-Assembler-Code (MSIL) ist in allen 3 Fällen identisch. Operationen (Rechnungen, Bibliotheksaufrufe von WinForms, etc) sind in allen 3 Varianten immer der gleiche MSIL-Code, damit auch gleich schnell. Aus Gründen der Geschwindigkeit besteht also kein Grund, z.B. C# statt VB.net einzusetzen, oder mC++. Dieses Argument kann man völlig außen vor lassen.



  • Vielen Dank!
    Eure Bemühungen mir etwas über .Net zu erzählen haben mir sehr weitergeholfen.

    Und damit der Thread wirklich was für die FAQ ist: http://www.devhood.com

    Dort kann man sich im Bereich Training Modules 4 "Distributionen" Downloaden, die jeweils 3 Tutorials mit Beispielprojekten und PowerPoint Präsentationen Downloaden.
    Es werden Themen wie die Grundlagen von .Net, die Programmiersprache C# uvm. behandelt.
    Man muss sich nur mit nem .Net Passport einloggen um alle Tutorials lesen zu können.

    Mein Resümee:
    Um das .Net Framework effizient nutzen zu können, sollte man C# als Programmiersprache verwenden.
    VB.Net eher nicht, weil VisualBasic eben mehr Basic ist.

    Von der Performance aber kein Unterschied, da der erstellte "managed" Source n eine Zwischensprache übersetzt wird. (Deshalb sind managed Komponenten i.a. Sprachunabhängig.)

    C++ eignet sich eher nicht für .Net Apps, da es keine windows Forms verwenden kann.

    Also:

    MFC -> C++
    .Net -> C#

    Ich hoffe das alles stimmt. 🙄



  • Bitte in die C# - FAQ stellen.


Anmelden zum Antworten