C# dateien starten?

3 Antworten

Hier eine kleine Batch, mit welcher ich kleine C#-Scripte onthefly cömpiliere.

Die für .Net-Framework4.8 ist etwas ausgefeilter . Erkennt und compiliert automatisch Windows-Forms-Programme und Media-/Sprach-Ein&Ausgabe. Läuft auf jedem Windows ab 10 ohne zusätzliche Installationen.

Einfach eine (Text)datei mit dem C#-code auf die Batch ziehen. (die Dateiendung .cs ist nicht nötig. Dem Compiler ist es egal, Hauptsache der Code ist richtig.)

c#_compile.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
) else (
    echo "%csc%" gefunden.
)

set "WPF_Path=C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WPF"
set "WPF_Speech=/reference:%WPF_Path%\system.speech.dll"
set "WPF_Media=/reference:%WPF_Path%\PresentationCore.dll"
set "WPF_WindowBase=/reference:%WPF_Path%\WindowsBase.dll"
set "Platform=/platform:anycpu"


set "Switches=/nologo %Platform% %WPF_Speech% %WPF_Media% %WPF_WindowBase%"
rem teste ob es sich um eine Windowsformsaplikation handeln könnte
for /f "tokens=*" %%a in ('type "%~f1" ^|findstr /irc:"using  *System\.Windows\.Forms *;" /c:"static  *....*  *Main *(.*)" /c:"Application.Run *(.*)"') do @(
  set /a "IsWinApp+=1"
  echo %%a |find /i "Main">nul &&(set "IsApp=1")
)

if "%IsWinApp%" == "3" (call :AskCompileWinApp)
if "%IsApp%" neq "1" (goto :NoApp)

set "inputFile=%~f1"
set "outputFile=%~dpn1.exe"
call:compile  %Switches%  -out:"%outputFile%" "%inputFile%" && (
    echo Hat geklappt...
    echo ...." %~dpn1.exe"...
    echo Ausgabe Deines Programms:
    cd /d "%~dp1"
    echo:
    "%~dpn1.exe"
    echo:
) || (
    echo Compilererror...
    echo:
    type compile.log
    echo:
)
pause
exit /b

::::::::: subroutines
:compile 
"%csc%" %* >compile.log
exit /b

:AskCompileWinApp
echo:
echo possible WindowsApplication
echo Compile as WindowsGUIApp without Console?
choice /c yn /t 1 /d y 
if %errorlevel% equ 1 (set Switches=%Switches% /target:winexe)
exit /b
:NoApp
echo Maybe an Library?
echo Doing nothing  jet!
pause

Für .Net Core -Projekte macht es nicht viel Sinn per Batch Forms/WPF -Apps zu compilieren. Desshalb nur ein kleine Batch welche automatisiert einen einen (Consol)Projectordner erstellt und ein Release-Build durchführt . (DotNet muss auf dem Rechner installiert sein)

build_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
)


set "Compiler=dotnet.exe"
where /q "%Compiler%" ||(
    echo "%Compiler%" not  found in "%cd%" or Path...
    timeout 3 >nul
    exit /b 1
)


set "SourceFileFolder=%~dp1"
set "ProjectFolder=%~dpn1"
md "%ProjectFolder%"
cd /d "%ProjectFolder%"
if not exist "%~n1.csproj" (%Compiler% new console)
copy /y "%~f1" "Program.cs"
%Compiler% publish   -p:PublishSingleFile=true --self-contained false  -c Release -r win-x64
for /f "tokens=*" %%a in ('dir /s /b "bin\%~n1.exe" ^|find /i "\publish\"') do (
    set "Publish.FullName=%%~fa"
    set "Publish.Path=%%~dpa"
    set "Publish.Name=%%~nxa"
)
cd /d "%SourceFileFolder%"
move "%Publish.FullName%" "%SourceFileFolder%"
start "Output:%Publish.Name%" "%Publish.Name%"
pause
exit /b

Beide Batches sind Droptargets. Das heißt, einfach die Quelldatei auf die Batchdatei ziehen.

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Für .NET (Core)-Projekte kannst du mit dem dotnet-Befehl Projekte in der CLI erstellen und bauen. Das heißt, du legst dir im besten Fall erst einmal ein neues Konsolenprojekt an:

dotnet new console --framework net7.0

Sofern der dotnet-Befehl in der Konsole nicht gefunden wird, schau nach, ob es den Ordner C:\Program Files\dotnet gibt.

  • Wenn nein, musst du das .NET SDK erst installieren.
  • Wenn ja, könntest du den Ordnerpfad entweder in der PATH-Umgebungsvariable hinzufügen oder du schreibst den Dateipfad zum dotnet-Programm stets in der Konsole mit.
C:\Program Files\dotnet\dotnet.exe new console ...

In das erstellte Projekt fügst du deine Datei ein (bzw. ersetzt die Program.cs mit deiner Datei). Mit run könntest du dein Projekt bauen und starten, via build / msbuild bauen. Schau dazu in die CLI-Dokumentation.

Die Schritte für eine Publizierung (Bundling) werden in diesem Artikel: Single-file deployment and executable erklärt.

Für Projekte des .NET-Framework kannst du den Command Line Compiler nutzen. Der sollte im Installationsverzeichnis deiner .NET-Framework Runtime liegen (also C:\Windows\Microsoft.NET\Framework\<Version>\csc.exe).

Eine Anweisung zur Kompilierung könnte folgendermaßen aussehen:

C:\...\csc.exe /t:exe /out:YourProgramName.exe YourCsharpFile.cs

In deiner C#-Datei müsste eine Main-Methode vorliegen. Das Programm wird zu einer Executable konvertiert.

Übrigens gibt es auch eine REPL für C#: Das CSI.

Aktuell ist es Zusatz der Visual Studio Build Tools beim Roslyn-Compiler.

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn\csi.exe

Eine Alternative dazu ist dotnet-script.

Eine C# Datei (.cs) kann man nicht starten, da sie nur den C# Quellcode als Text enthält. Man müsste diese Quellcode erst mit z. B. Visual Studio kompilieren und daraus z. B eine exekutierbare Datei (.exe) machen.

Woher ich das weiß:Hobby