C# mehrere Einstiegspunkte definiert?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Dann hast Du mehrere Einstiegspunkte im Start-Projekt.
Normalerweise wird nach einer statischen Main-Methode gesucht, findet er mehrere, hast Du mehrere Einstiegspunkte.

Ein eigenes Compile-Script ist jedenfalls völlig unnötig, zumindest für das, was Du vor hast.

Und das alte .NET-Framework (heißt ".NET Framework") ist tot und sollte nicht mehr verwendet werden. Die Neuentwicklung heißt nur ".NET" (ohne "Framework"). Am Code ändert sich meistens nichts, nur die csproj-Dateien sind deutlich einfacher geworden.

Und warum arbeitest Du immer noch direkt mit der Enumerable-Klasse?

Woher ich das weiß:Berufserfahrung
Nocturno601 
Fragesteller
 13.10.2021, 19:06

Hallo erstes mal vielen Dank für deinen Kommentar, aber ich weis leider nicht was ein Compile-Script ist, außerdem habe ich eigentlich gar nichts mit .NET verwendet sondern in Visual Studio nur eine Konsolenanwendung mit C# erstellt. Außerdem finde ich bei Visualstudio nur .NET Framework's und was sind csproj-Dateien? Und das mit der Enunumerable-Klasse hatte ich nur im Internet zum vergleichen von Arrays gefunden, habe aber auch ein anderen Code wo ich statt die Arrays mit einander, lösung[0] und zahl[0], lösung[1] und zalh[1],... mit einander vergleiche. (sry dass ich kaum Ahnung habe, ich habe mir halt nur einige C# tutorials angeschaut und dann probiert mit meinem jetzigen Wissen diese Lotterie zu coden)

0
Palladin007  13.10.2021, 22:37
@Nocturno601
aber ich weis leider nicht was ein Compile-Script ist

Der Teil bezog sich auf das, was Erzesel geschrieben hat.
Das macht man schon lange nicht mehr so ;)
Und das ist für einen Anfänger auch definitiv der falsche Einstieg.

außerdem habe ich eigentlich gar nichts mit .NET verwendet sondern in Visual Studio nur eine Konsolenanwendung mit C# erstellt

Also hast Du doch .NET verwendet ;) Das ist .NET.
Zumindest solange dein Visual Studio alt genug ist, am besten Du nutzt Visual Studio 2019. Ich nutze 2022, aber die Version gibt's bisher nur als Preview.

Außerdem finde ich bei Visualstudio nur .NET Framework's

Du meinst in Klammern ".NET Framework"? Das ist das alte .NET (geht bis Version 4.8) und sollte nicht mehr genutzt werden. Aber ja, die Namensgebung ist etwas verwirrend und leider bietet Microsoft keine Übersicht dazu :/

Beispiel bei mir:

  1. Console Application
  2. Console App (.NET Framework)

Beides ist ein Konsolen-Programm, wie Du es erwarten würdest.
Das Erste ist aber mit dem neuen Aufbau (.NET 5) und das Zweite ist das alte .NET 4.8.
Das klingt alles sehr ähnlich, und das fällt dir im Code auch nicht direkt auf, aber technisch im Hintergrund liegen dazwischen Welten.

Du solltest einfach .NET 5 nehmen, die meisten C#-Beispiele funktionieren genauso. Erst bei z.B. WinForms oder WPF (da bist Du ja noch nicht) gibt's Unterschiede, aber dafür gibt's dann auch gute Artikel von Microsoft.

was sind csproj-Dateien

Das sind die Projekt-Dateien von C#, da drin ist definiert, was dein Code ist, welche Framework-Version und noch anderes Zeug.
Beim alten Framework waren die sehr komplex.

Du brauchst das erst mal nicht (es reicht zu wissen, dass es sie gibt), langfristig lohnt es sich aber, die Inhalte zumindest grob zu kennen. Und mir hat es die Arbeit enorm erleichtert ^^

Und das mit der Enunumerable-Klasse hatte ich nur im Internet zum vergleichen von Arrays gefunden, habe aber auch ein anderen Code wo ich statt die Arrays mit einander, lösung[0] und zahl[0], lösung[1] und zalh[1],... mit einander vergleiche.

Ich hab's dir auch unter deiner anderen Frage geschrieben:

if (lösung.SequenceEqual(number))

... geht auch und ist auch noch übersichtlicher.

Du kannst natürlich auch manuell zwei Arrays über eine Schleife vergleichen, zur Übung sicher ganz gut, aber für ein richtiges Projekt würde ich das nicht machen.

Oder Du schaust dir die Original-Implementierung auf GitHub an:runtime/SequenceEqual.cs at main · dotnet/runtime (github.com)
Oder die alte (.NET 4.8) Variante:
SequenceEqual (microsoft.com)

Beide sind viel komplexer als das, was Du erwarten würdest, das hat hauptsächlich Performance-Gründe und weil sie intern einiges mehr können müssen, als nur Arrays.
Doch wenn es dich interessiert, schau rein, aber sei nicht enttäuscht, wenn Du es nicht verstehst. Ich kenne viele C#-Entwickler, die trotz sehr viel mehr Erfahrung diese Details noch nicht so wirklich verstanden haben und auch ein paar, die quasi Angst davor haben :D

Für dich reicht erst mal, dass es die "SequenceEqual"-Methode gibt und dass sie Arrays vergleichen kann.

ich habe mir halt nur einige C# tutorials angeschaut

Ja, das ist keine gute Idee, die taugen fast nie etwas. Es gibt zwar auch was von Microsoft (bzw. einem Microsoft-Mitarbeite) selber, aber an ein gutes Buch (z.B. "Visual C# 2019") reicht das nicht heran.

1

geht doch...

Keine Ahnung was Du da treibst...

Compilier mal mit dem windowseigenen Kommandozeilencompieler.

compile_c#.cmd

@echo off
chcp 65001 >nul
if "%~1"=="" (
    echo C# Compiler-Batch.
    echo:
    echo Ziehe eine Datei mit C#-Source auf "%~nx0" ...
    timeout 7
    exit /b
)
for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\*csc.exe"') do (
set "csc=%%v"
)
if "%csc%"==""  (
echo Kein C#-Compiler gefunden
echo Bitte installiere Microsoft-.NetFramework!
pause
exit /b
)
echo "%csc%" gefunden.
"%csc%" -nologo  -out:"%~dpn1.exe" "%~f1" >compile.log && (
    echo Hat geklappt...
    echo .... %~dpn1.exe...
    echo Ausgabe Deines Programms:
    echo:
    "%~dpn1.exe"
    echo:
    pause
) || (
    echo Compilererror...
    echo:
    type compile.log
    echo:
    pause
)

Die Batch speichern und die und deine Quelltextdatei einfach auf die Batch ziehen.

Hier noch mal als C#Hybridbatch mit integriertem Quelltext

demo.cmd

/* 2>nul ||@cls  diese  zeile nicht ändern 
@echo off
for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*csc.exe"') do (
set "csc=%%v"
)
"%csc%" -nologo /out:"%~n0.exe" %0>compile.log && (
    echo Hat geklappt...
    echo .... "%~dpn0.exe".....
    echo Ausgabe Deines Programms:
    echo:
    "%~dpn0.exe"
    echo:
    pause
) || (
    echo Compilererror...
    echo:
    type compile.log
    echo:
    pause
)


exit /b 
rem Die nächste Zeile ist wichtig nicht ändern!
::::C#code */
using System;
using System.Linq;


namespace ConsoleApp564
{
    class Program
    {
        public static void Main(string[] args)
        {
            Random Zufallszahl = new Random();
            int lösung1 = Convert.ToInt32(Zufallszahl.Next(1, 49));
            int lösung2 = Convert.ToInt32(Zufallszahl.Next(1, 49));
            int lösung3 = Convert.ToInt32(Zufallszahl.Next(1, 49));


            int[] lösung = new int[3] { lösung1, lösung2, lösung3 };
            Array.Sort(lösung);


            int zahl1;
            int zahl2;
            int zahl3;


            Console.WriteLine("Wilkommen in der Lotterie");
            Console.Write("Geben sie ihre erste Zahl eine, diese muss zwischen 1 und 49 liegen: ");
            zahl1 = Convert.ToInt32(Console.ReadLine());


            if (zahl1 <= 49 && zahl1 >= 1)
            {
                Console.Write("Geben sie ihre zweite Zahl ein, diese muss zwischen 1 und 49 liegen: ");
                zahl2 = Convert.ToInt32(Console.ReadLine());


                if (zahl2 <= 49 && zahl2 >= 1)
                {
                    Console.Write("Geben sie ihre dritte Zahl ein, diese muss zwischen 1 und 49 liegen: ");
                    zahl3 = Convert.ToInt32(Console.ReadLine());


                    if (zahl3 <= 49 && zahl3 >= 1)
                    {
                        int[] number = new int[3] { zahl1, zahl2, zahl3 };
                        Array.Sort(lösung);
                        if ((Enumerable.SequenceEqual(lösung, number)))
                        {
                            Console.WriteLine("Sie haben gewonnen!");
                        }
                        else
                            Console.WriteLine("Sie haben verloren die Lösungzahlen waren " + lösung1 + ", " + lösung2 + " und " + lösung3 + ". Sie haben " + zahl1 + ", " + zahl2 + " und " + zahl3 + " getippt.");
                    }
                }
                else
                {
                    Console.WriteLine("Die Zahl muss zwischen 1 und 49 liegen!");
                    return;
                }
            }
        }
    }
}



Palladin007  13.10.2021, 16:43

Das alte .NET-Framework ist tot und sollte nicht mehr verwendet werden.
So ein Skript braucht man auch in den meisten Fällen nicht oder zumindest ein Anfänger braucht es nicht. Einfach aus VS heraus starten reicht aus.

Und wer doch ein Skript möchte: Mit dem neuen .NET ist das ein Einzeiler, vorausgesetzt, man hat csproj-Dateien (oder sln bei mehreren Projekten).

0
Erzesel  13.10.2021, 17:42
@Palladin007

Ist mir klar das der Famworkcompiler schon bei Installation von win 10 vor einigen Jahren nicht ganz taufrisch war. Die aufgezeigte Lösung funktioniert ohne irgendwelche zusätzlichen Installationen auf jedem "jungfäulichen" Windows 10.

Wenn ich etwas im Blindflug mache, ohne zu wissen welche Voraussetzungen auf dem Rechner eines Nutzers bestehen, wähle ich das Werkzeug, auf dass ich garantiert Zugriff habe!

Ich habe VS nicht mehr auf meinem Rechner installiert, weil ich es für meine Bedürfnisse nicht mehr benötige. (ich bin nicht ohne Grund im Ruhestand und wenn ich wieder mit den großen Sachen anfange, bin ich ganz schnell dort, wo es mich vor ein paar Jahren plattgelegt hat)

Was passiert, wenn Jemand mit den "großen Geschützen" nicht zurechtkommt, sehen wir...😏😜

Für billige kleine Progrämmchen genügt der 4.8er Compiler und Notepad++.

Es funktioniert...

Ich habe auch Powershell Core 7 und genieße die neuen Features. Aber schreibe ich ein Script für Fremde (ich betreue noch ein paar ganz alte Kunden), gehe zurück auf 5.1 , weil es eben auf jedem Win10 Rechner laufen muss. Für Win 7 -Mühlen muss ich sogar 2.0-Kompatibel schreiben. Gruselig und zum Glück selten.

Auf vielen Firmenrechnern kann man nicht einfach Software (nach)installieren wie es einem in den Gusto passt, deshalb ist es immer Vorteilhaft sich als Programmierer an die Gegebenheiten anzupassen.

Deshalb lehne ich auch Python ab. Ich kann von niemandem verlangen eine Runtime zu installieren, nur damit ich nach eigenen Vorlieben programmieren kann.

0
Palladin007  13.10.2021, 22:08
@Erzesel
Ist mir klar das der Famworkcompiler schon bei Installation von win 10 vor einigen Jahren nicht ganz taufrisch war.

Mir geht's nicht um taufrisch oder nicht, sondern dass es abgekündigt ist. Es wird noch ein paar Jahre Support gebe, aber früher oder später wird Microsoft es ganz beenden. Weiterentwickelt wird es jedenfalls schon heute nicht mehr.

Die aufgezeigte Lösung funktioniert ohne irgendwelche zusätzlichen Installationen auf jedem "jungfäulichen" Windows 10.

Wenn nur das das Ziel ist: self-contained

Für billige kleine Progrämmchen genügt der 4.8er Compiler und Notepad++.
Es funktioniert...

Sorry, aber diese Argumentation ist der Grund für viele Probleme.
Nur weil es funktioniert, sollte man nicht dabei bleiben, es könnte sein, dass Du etwas Besseres übersiehst.

Und hier ist das der Fall.

.NET 5 hat einen viel einfacheren csproj-Aufbau, die Performance ist deutlich besser, die CLI ist deutlich einfacher, es läuft überall und wenn .NET nicht installiert ist, legt man es eben selber dazu.

Du kannst natürlich weiterhin dein Skript nutzen, wenn Du es einfacher findest, ok. Ich nutz dann doch lieber "dotnet build" und spar mir das ganze Skript :)

Ich habe VS nicht mehr auf meinem Rechner installiert

Visual Studio Code?
Ist deutlich leichtgewichtiger, Visual Studio fordert den PC mittlerweile ja schon sehr.

Oder eben Notepad++, die neue CLI ist explizit dafür gebaut, dass man nur mit der CLI arbeiten kann, auch ohne Visual Studio oder Visual Studio Code.

Auf vielen Firmenrechnern kann man nicht einfach Software (nach)installieren wie es einem in den Gusto passt

Dann liefere das Framework mit, muss ja nicht installiert sein.
Es gibt sogar ein Feature (Trimming), was den Speicherbedarf reduzieren soll, falls das ein Problem sein sollte.

[...], deshalb ist es immer Vorteilhaft sich als Programmierer an die Gegebenheiten anzupassen.

Das sehe ich völlig anders.

Man sollte sich gerade nicht immer den Gegebenheiten anpassen, denn das führt zwangsläufig zu Stillstand und nichts ist teurer als Stillstand. Viel wichtiger ist, die Gegebenheiten zu hinterfragen und herauszufinden, warum das angeblich nicht geht. Oft ist das nur irgendwer, der zu faul, geizig oder ängstlich ist oder jemand, der das Risiko nicht eingehen möchte, dabei aber das größere Risiko übersieht.

Natürlich gibt es auch Fälle, wo es wirklich nicht geht, aber das sind meiner Erfahrung nach dann immer die Fälle, die schon seit zig Jahren ein altes System vor sich herschieben und irgendwann wirklich nicht mehr vor oder zurück können.
Und bei diesen Fällen sage ich dann ganz einfach: Nicht mit mir, ich such mir eine andere Firma :)

Ich kann von niemandem verlangen eine Runtime zu installieren, nur damit ich nach eigenen Vorlieben programmieren kann.

Doch kannst Du und viele Firmen tun das auch.
Oder ist dir noch nie aufgefallen, dass diverse Installer nicht nur das eigentliche Programm installieren, sondern auch noch zusätzlich benötigte Software?
Das ist gängige Praxis :)

=======

Abgesehen davon ist das hier ein Anfänger und einen Anfänger mit einem alten und komplexeren Framework und zusätzlich noch ein selbst geschriebenes Skript, das sonst niemand so macht, zu empfehlen - das ist definitiv nicht klug ;)

0