2016-06-29 7 views
1

Man mag sich fragen - wie man eine .bat Datei mit eingebettetem C# -Code erstellt, um sie "on-the-fly" zu kompilieren und auszuführen?
Ist es möglich, Batch-Anweisungen und C# -Code in einer Datei zu haben?C# Quellcode eingebettet in .bat Datei

Antwort

2

Ja, es ist möglich.
Hier ist ein Beispiel:

example.bat

/* 2> nul 
@echo off && cls && echo Loading... && echo. 
set WinDirNet=%WinDir%\Microsoft.NET\Framework 
if exist "%WinDirNet%\v2.0.50727\csc.exe" set csc="%WinDirNet%\v2.0.50727\csc.exe" 
if exist "%WinDirNet%\v3.5\csc.exe" set csc="%WinDirNet%\v3.5\csc.exe" 
if exist "%WinDirNet%\v4.0.30319\csc.exe" set csc="%WinDirNet%\v4.0.30319\csc.exe" 
if "%csc%" == "" (echo .NET Framework not found! && echo. && pause && exit) 
%csc% /nologo /out:"%~dpnx0.exe" "%~dpnx0" 
if not "%ERRORLEVEL%" == "0" (echo. && pause && exit) 
cls 
"%~dpnx0.exe" %* 
del "%~dpnx0.exe" 
exit 
*/ 

using System; 
class Program 
{ 
    static void Main() 
    { 
     System.Console.WriteLine("Hello, World!\r\nI am at " + System.Environment.Version); 
    } 
} 

Erläuterung: Diese Batch-Datei aus zwei Teilen bestehen: Zum einen chargen Code und sekundäre einem C# -Code. Bei der Ausführung ignoriert die Kommandozeile C# -comments /* und */ als Fehlerzeilen und führt nur Batch-Code aus. Aufgrund des exit-Befehls am Ende des Batch-Blocks erreicht die Ausführung niemals C# -Code.
Batch-Teil der Datei sucht nach csc.exe (.NET-Compiler). Nach dem Fund wird die Batchdatei in csc.exe übergeben, um den C# -Code zu kompilieren. Aufgrund von Kommentaren (/ * und * /) wird Batch-Part ignoriert und nur C# Teil wird kompiliert. Nach der Kompilierung wird eine .exe-Datei ausgeführt und nach der Ausführung gelöscht.

Bearbeiten: 2> nul umleiten Standardfehler (Deskriptor 2) auf Null, um "nicht gefunden" Nachricht zu unterdrücken.

+1

Sie erhalten ''/ *' wird nicht als interne oder externe Befehl, ausführbare Programm oder Batch-Datei erkannt.' Immer wenn Sie die Batch-Datei starten, obwohl: p – Nyerguds

+1

@Nyerguds Ich denke,' cls' soll um darauf zu achten: p – Stephan

+0

@ Nyerguds es funktioniert gut für mich. – Exerion

1

Sie können den Stapelcode auskommentieren, aber Sie können nicht vermeiden, dass der Kommentar von Stapel als Fehler behandelt wird.

Der Fehler selbst kann unterdrückt werden, aber mindestens die erste Zeile wird angezeigt.

/* 2>NUL 
@echo off 
... 
start the C# code 
*/ 
... 
C#-Code 

Als C# nicht scheint eine der :@ Zeichen als erstes Zeichen in einer Datei zu akzeptieren, kann ich nicht einen möglichen Weg für eine perfekte Lösung sehen.