57 Stimmen

Was genau ist "verwalteter" Code?

Ich schreibe seit fast zwanzig Jahren C/C++-Code und kenne mich auch mit Perl, Python, PHP und etwas Java aus, und ich bringe mir gerade JavaScript bei. Aber ich habe noch nie etwas mit .NET, VB oder C# gemacht. Was genau bedeutet verwaltet Code bedeuten?

Wikipedia beschreibt es einfach als

Code, der unter der Verwaltung einer virtuellen Maschine ausgeführt wird

und er sagt ausdrücklich, dass Java (normalerweise) verwalteter Code ist, also

  • warum scheint der Begriff nur für C# / .NET zu gelten?
  • Können Sie C# in eine Exe-Datei kompilieren, die auch die VM enthält, oder müssen Sie es verpacken und an eine andere Exe-Datei übergeben (a la Java)?

In ähnlicher Weise,

  • ist .NET ein Sprache oder eine Rahmenwerk und was genau bedeutet "Rahmen" hier?

OK, das ist also mehr als eine Frage, aber für jemanden, der schon so lange in der Branche ist wie ich, fühle ich mich im Moment eher wie ein N00B...

38voto

lnediger Punkte 1310

Wenn Sie C#-Code zu einer .exe kompilieren, wird er zu Common Intermediate Language (CIL) Bytecode kompiliert. Wenn Sie eine ausführbare CIL-Datei ausführen, wird sie auf Microsofts Common Language Runtime (CLR) Virtual Machine ausgeführt. Es ist also nicht möglich, die VM in Ihre ausführbare .NET-Datei einzubinden. Sie müssen die .NET-Laufzeitumgebung auf allen Client-Rechnern installieren, auf denen Ihr Programm ausgeführt werden soll.

Um Ihre zweite Frage zu beantworten: .NET ist ein Rahmenwerk, d. h. es handelt sich um einen Satz von Bibliotheken, Compilern und VM, der nicht sprachspezifisch ist. Sie können also auf dem .NET-Framework in C#, VB, C++ und allen anderen Sprachen, die einen .NET-Compiler haben, programmieren.

https://bitbucket.org/brianritchie/wiki/wiki/.NET%20Languages

Auf der obigen Seite finden Sie eine Liste der Sprachen, die über .NET-Versionen verfügen, sowie Links zu den entsprechenden Seiten.

13voto

Keith Elder Punkte 1729

Ich glaube nicht, dass Sie der einzige sind, der nicht weiß, was .Net ist. Es gibt bereits andere Antworten, die Sie abdecken sollten, aber ich werde diesen Leckerbissen an Informationen für andere herauswerfen.

Um zu sehen, was .Net "wirklich" ist, gehen Sie einfach zu c: \Windows\Microsoft.Net\Framework

Dort finden Sie Ordner, die für die von Ihnen installierte(n) Version(en) spezifisch sind. Gehen Sie zum Beispiel in den Ordner v2.0.xxxxx, wenn Sie diese Version installiert haben.

In diesem Ordner befindet sich das Framework. Sie werden im Wesentlichen eine Reihe von .exe-Dateien und .dll-Dateien sehen. Alle DLL-Dateien, die mit System.*.dll beginnen, sind im Wesentlichen das .Net-Framework.

Die .exe-Dateien, die Sie in diesem Ordner sehen, sind Dienstprogramme für Entwickler und Compiler. Sie haben C# erwähnt. Suchen Sie die Datei csc.exe. Das ist Ihr C#-Compiler.

Die Erstellung eines Programms ist wirklich einfach. Fügen Sie den folgenden Code in eine hello.cs-Datei ein.

using System;
class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("hello world");
        }
    }

Geben Sie dann in der Befehlszeile> csc hello.cs ein

Dadurch erhalten Sie eine .exe-Datei. Führen Sie sie aus und sie wird offensichtlich "Hallo Welt" ausspucken.

Die Zeile, in der Console.WriteLine() steht, ruft das Framework auf. Console ist ein Objekt, das im Namensraum System lebt, und WriteLine() ist eine statische Methode.

Dies ist der disassemblierte Code für die Methode Console.WriteLine():

[HostProtection(SecurityAction.LinkDemand, UI=true)]
public static void WriteLine(string value)
{
    Out.WriteLine(value);
}

Wenn Leute Dinge sagen wie: "Soll ich PHP oder .Net verwenden?" oder "Soll ich Python oder .Net verwenden", dann wird klar, dass das die falsche Diskussion ist. Sie vergleichen offensichtlich eine Sprache mit einem Framework. C# ist eine Sprache und nur eine der vielen Sprachen, die zum Schreiben von Code auf der .Net-Plattform verwendet werden können. Dieselbe Methode Console.WriteLine() kann von C#, VB.Net, Pascal, C++, Ruby, Python, F# und jeder anderen Sprache aufgerufen werden, die auf der .Net-Plattform läuft.

Ich hoffe, das hilft.

-Keith

11voto

Vagnerr Punkte 2917

Meistens bezieht sich das auf die Tatsache, dass alle Ihre Speicherzuweisungen für Sie "verwaltet" werden. Wenn Sie verwalteten Code verwenden, müssen Sie sich nicht darum kümmern, Ihre Objekte freizugeben, wenn Sie mit ihnen fertig sind. Wenn man ihnen einfach erlaubt, aus dem Geltungsbereich herauszugehen, wird die VM irgendwann erkennen, dass es keine Verweise mehr auf sie gibt, und den Speicher wieder an das System zurückgeben.

Nicht verwalteter Code hingegen wird einfach "auslaufen", es sei denn, Sie geben Ihre Zeiger ausdrücklich frei, bevor Sie die Verweise verwerfen.

10voto

Chris Upchurch Punkte 14893

Er wird in erster Linie zur Beschreibung von .NET verwendet, weil Microsoft diesen Begriff gewählt hat, um .NET von C/C++ und anderen älteren Sprachen zu unterscheiden. Microsoft wählte ihn, weil es sich nicht um einen Begriff handelte, der normalerweise mit Java assoziiert wird, weil sie die Ähnlichkeiten zwischen C#/.NET und Java nicht betonen wollten (im Gegensatz zu einer Bezeichnung wie "Virtual Machine Code", die viel mehr nach Java klingen würde). Im Grunde ist die Verwendung von "verwaltetem Code" eher eine marketingorientierte als eine technisch orientierte Terminologie.

6voto

Josh Smeaton Punkte 45913

Unter .NET und insbesondere Visual C++ können Sie sowohl unverwalteten als auch verwalteten Code haben. Die Begriffe beziehen sich auf die Art und Weise, in der Speicher zugewiesen und "verwaltet" wird.

Nicht verwalteter Code wäre das C++-Zeug, an das Sie gewöhnt sind. Dynamische Speicherzuweisung und explizites Freigeben des Speichers. Die .NET-Laufzeit verwaltet den Speicher nicht für Sie, daher "unmanaged".

Verwalteter Code hingegen wird von der Laufzeit verwaltet. Sie weisen bei Bedarf Speicher zu (durch Deklaration von Variablen, nicht von Speicherplatz), und der Garbage Collector der Laufzeit bestimmt, wann er nicht mehr benötigt wird, und räumt alles auf. Der Garbage Collector verschiebt auch den Speicher, um die Effizienz zu verbessern. Die Laufzeit 'verwaltet' das alles für Sie.

Wie bereits erwähnt, ist es möglich, Code zu schreiben, der sowohl verwaltet als auch nicht verwaltet ist.

Unverwaltet:

class Bar : public Foo {
    private:
            int fubar;
    public:
            Bar(int i) : fubar(i) {}
            int * getFubar() { return * fubar; }
}

Verwaltet:

public ref class Bar :  public Foo
    private:
            int fubar;
    public:
            Bar(int i) : fubar(i) {}
            int ^ getFubar() { return ^ fubar; }
}

Haben Sie den Schiedsrichter bemerkt? Das bezeichnet ziemlich genau eine verwaltete Klasse. Es wird jedoch sehr verwirrend, wenn Sie die beiden Arten von Code vermischen. Sie möchten zum Beispiel einen Referenzzeiger (^), das verwaltete Äquivalent eines Zeigers, auf ein Picture Box-Steuerelement in Ihrer nicht verwalteten Klasse speichern. Da der Garbage Collector den Speicher verschieben kann, kann die Picture Box beim nächsten Versuch, sie zu derefenzieren, nicht mehr gefunden werden. Die Laufzeit informiert Ihren nicht verwalteten Code nicht über seine Speicheränderungen.

Daher müssen Sie das verwaltete Objekt im Speicher festhalten, damit Ihr nicht verwalteter Code es im Auge behalten kann. Dann gibt es noch Unboxing und alle möglichen anderen Macken, die es erlauben, die beiden zu vermischen. Die Komplexität des Codes ist enorm!

Offiziell ist die Unterscheidung zwischen verwaltetem und nicht verwaltetem Code auf die Art und Weise zurückzuführen, wie der Code auf dem .NET-Stack ausgeführt wird. Wenn Sie jedoch von einem C++-Hintergrund kommen, hoffe ich, dass dies für Sie ein wenig relevanter ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X