Mehrere Hauptfunktionen

69

Ich bin ein bisschen neu in diesem Bereich, also nimm es mit. Ich lerne gerade C # und Java und eine ihrer Ähnlichkeiten ist, dass die Hauptfunktion in einer Klasse gekapselt werden muss. Zum Beispiel

public class HelloWorld {
    public static void main(String[] args) {
        // Some Code
    }
}

Jetzt verstehe ich, dass main oft der "Einstiegspunkt" ist, wenn Sie das Programm ausführen. Im Grunde genommen wird Ihr Programm überall dort ausgeführt, wo sich die Hauptfunktion befindet. Aber ich glaube, dass Sie in beiden Sprachen mehrere Hauptfunktionen in mehreren Klassen haben können. Wo ist also der "Einstiegspunkt", wenn ich ein Projekt mit mehreren Hauptfunktionen kompiliere? Woher weiß der Compiler, wo er anfangen soll?

Ben
quelle
14
Die Antwort ist für jede Sprache unterschiedlich.
Mark Byers

Antworten:

57

In .NET können Sie definieren, welche Klasse die Main-Methode enthält, die Sie beim Kompilieren verwenden möchten.

http://msdn.microsoft.com/en-us/library/x3eht538.aspx

Wenn Sie in Java ein Jar bündeln, können Sie Ihren Einstiegspunkt im Manifest des Jars definieren.

http://docs.oracle.com/javase/tutorial/deployment/jar/appman.html

MStodd
quelle
9
Ich bin überrascht, dass dies die am häufigsten gewählte Antwort ist. Zumindest für Java scheinen die Antworten von Code-Guru und @CosmicComputer für die meisten Menschen relevanter zu sein. Ich würde sagen, dass nur sehr wenige Entwickler, mit Ausnahme der wenigen "ausführbaren" Versandgläser, jemals die Manifest-Methode verwenden.
George Hawkins
3
@ GeorgeHawkins Es scheint mir, dass dies die einzige Antwort ist, die die Frage für beide Sprachen beantwortet, obwohl es für Java vielleicht nicht die beste Antwort ist.
11684
58

In Java bestimmt der Computer den "Einstiegspunkt", wenn Sie das Programm tatsächlich ausführen, nicht, wenn Sie kompilieren. Zum Beispiel über die Befehlszeile

java MyClass

sucht nach main()in MyClass. Alle anderen main()Funktionen werden ignoriert.

Wenn Sie eine IDE verwenden, können Sie festlegen, welche Klasse die main()Funktion enthält, die Sie verwenden möchten.

Code-Lehrling
quelle
3
In Java wird nach gesucht public static void main(String[] args).
Luiggi Mendoza
7
@LuiggiMendoza Ja, das ist richtig. Der Kürze halber habe ich die vollständige Signatur für main () weggelassen, da das OP bereits gezeigt hat, dass er weiß, was es ist.
Code-Lehrling
5
Oder für eine Methodensignatur public static void main(String[])oder public static void main(String ...)werden sehr präzise.
Maarten Bodewes
2
Die anderen Hauptmethoden werden nicht "ignoriert", sondern nur nicht automatisch ausgeführt. Ein Programmierer kann Code schreiben, der explizit die Hauptmethode einer Klasse aufruft.
Zeke Hansell
3
Woohoo! Mein erstes silbernes Abzeichen! Vielen Dank an alle, die für diese Antwort gestimmt haben!
Code-Lehrling
17

In C # können Sie mehrere MainMethoden verwenden.

Wenn es mehrere MainMethoden gibt, weiß der Compiler nicht, welchen Einstiegspunkt er verwenden soll, und zeigt daher einen Fehler an.

Sie müssen die MainMethode angeben , die beim Kompilieren verwendet werden soll: Sie können angeben, welche Methode als Compileroption in der Visual Studio-Entwicklungsumgebung oder über den csc-Compiler verwendet werden soll.

Anirudha
quelle
1
Ich weiß nichts über C #, aber in Java ist dies falsch. Dem Java-Compiler ist es egal, welcher Einstiegspunkt verwendet wird. es wird alle von ihnen kompilieren. Andererseits muss der Laufzeitumgebung mitgeteilt werden, welcher Einstiegspunkt ausgeführt werden soll.
Code-Lehrling
2
Ja ... aber diese Ans bezog sich auf c # nicht Java
Anirudha
3
@ Code-Guru: Die Antwort ist für C # korrekt, da für eine Assembly zur Kompilierungszeit ein Einstiegspunkt angegeben wurde. Sie geben zur Ausführungszeit keinen Klassennamen an, sondern nur den Assemblynamen.
Jon Skeet
2
@ JonSkeet In der ursprünglichen Antwort wurde die Sprache nicht angegeben. Danke für die Bearbeitung, Anirudha.
Code-Apprentice
12

Die Hauptklasse ist aus nur einem Grund eine spezielle Klasse: Wenn Sie die Java Virtual Machine ausführen, wird diese Funktion von der JVM aufgerufen. Es ist im Wesentlichen wie jede andere Funktion, und tatsächlich können Sie die Hauptfunktion einer Klasse von einer anderen Klasse aus aufrufen.

Wenn Sie ein Projekt mit mehreren Klassen kompilieren, weisen Sie die JVM an, die Klasse mit der Hauptklasse auszuführen, die Sie verwenden möchten.

java SomeClass

und es wird die Hauptmethode von SomeClass ausgeführt, vorausgesetzt, dass SomeClass kompiliert ist und sich die entsprechende kompilierte Datei in Ihrem Klassenpfad befindet. (Das ist etwas, das Sie mit Ihrem speziellen Betriebssystem ausarbeiten müssen, aber ich denke, es ist ziemlich üblich, dass die Option -cp einen Klassenpfad angibt). Also das:

java -cp /home/MyName Someclass

führt die Hauptfunktion von SomeClass im Verzeichnis / home / MyName aus

CosmicComputer
quelle
9

In C # geben Sie den Einstiegspunkt mit der /main:Compileroption an.

Betrachten Sie den folgenden Code mit zwei main()Funktionen:

namespace Application {
    class ClassOne {
        static void main () {
            // Code here
        }
    }

    class ClassTwo {
        static void main () {
            // Code here
        }
    }
}

Um ClassOne.main()als Einstiegspunkt zu verwenden, würden Sie beim Kompilieren Folgendes angeben:

csc /main:Application.ClassOne hello.cs
SetFreeByTruth
quelle
7

Wie andere betonten, definieren Sie in Java die Klasse, die Ihre Hauptfunktion enthält, wenn Sie den javaBefehl ausführen .

Sie können aber auch eine ausführbare JAR-Datei erstellen, mit der ausgeführt werden kann java -jar my.jar. In diesem Fall benötigen Sie eine Manifestdatei, die MANIFEST.MFim Ordner META-INFim JAR aufgerufen wird . In dieser Datei geben Sie die Klasse mit der Hauptfunktion mit der folgenden Anweisung an : Main-Class: YourClass.

Sven Viehmeier
quelle
7

Für mehrere Hauptfunktionen kann der Einstiegspunkt deklariert werden durch:

So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung fest

Öffnen Sie die Seite Eigenschaften des Projekts.

Klicken Sie auf die Eigenschaftenseite Anwendung.

Ändern Sie die Startobjekteigenschaft.

Referenz: http://msdn.microsoft.com/en-us/library/x3eht538.aspx

NG.
quelle
Haben Sie eine Idee, dasselbe in JetBrain Rider zu tun? Ich habe versucht, die Eigenschaften der Projektanwendung zu überprüfen und konnte das Startobjekt
VectorX
Auf meinem Computer ist JetBrains leider nicht installiert.
NG.
Um das Startobjekt in Rider zu ändern, müssen Sie die .csproj-Datei bearbeiten (möglicherweise mit F4, abhängig von den Tastenkombinationen).
Siro Mateos
4

Die Hauptmethode ist statisch, dh sie gehört eher zur Klasse als zum Objekt. Das Objekt enthält also überhaupt keine andere Hauptmethode. Es wird keine zusätzliche Hauptmethode geben, da main statisch ist. Es ist also einmal pro Klasse.

Wenn Ihr Projekt mehrere Hauptmethoden enthält, geben Sie an, welche beim Starten Ihrer Anwendung gestartet werden soll

Yasir Mahmood
quelle
Nur zur Klarstellung, eine Klasse kann mehr als ein Hauptverfahren hat. Zum Beispiel könnten Sie public static void main()und haben public static void main(String[]). In Java sucht die Laufzeitumgebung nach der letzteren Signatur, die ausgeführt werden soll.
Code-Apprentice
2

In der Binärdatei, z. B. im PE-Format unter Windows und im ELF-Format unter Linux oder einem anderen System, gibt der Header der Binärdatei an, wo sich die Startadresse befindet und es kann nur eine geben.

Welches sollte der Einstiegspunkt sein? Das hängt vom Linker ab. Genau wie @SetFreeByTruth sagte, dass Sie es mit Befehlszeilenparametern angeben können. Viele Linker unterstützen die Angabe des Einstiegspunkts mit Befehlszeilenparametern. Zum Beispiel kann gnus gld den Einstiegspunkt mit dem Parameter -e angeben.

Ich kenne das Verhalten von Java nicht, da es von einer virtuellen Java-Maschine geladen wird.

Johnny WU
quelle
-1

In Visual Studio wählen Sie das Projekt aus, für das Sie der Einstiegspunkt sein möchten, klicken Sie mit der rechten Maustaste und legen Sie es als Startprojekt fest.

user7287181
quelle
das wäre das "Startup-Projekt", aber das ist nicht das, was sie bedeuten. Wenn Sie mehrere potenzielle Einstiegspunkte in einem Projekt / einer Baugruppe haben , öffnen Sie die Projekteigenschaften und wählen aus der Dropdown-Liste "Startobjekt" im Anwendungsbereich aus.
Cee McSharpface