csharp-self-contained

Cómo crear una aplicación .bat autoejecutable con .NET

Hoy vamos a ver como realizar una aplicación auto ejecutable de C#, contenida en un un fichero de punto .bat.

Normalmente pensamos en C# como una herramienta para realizar aplicaciones, grandes bien sea web o de escritorio. Es menos extendida su uso como lenguaje de scripting, donde destacan normalmente los lenguajes interpretados.

Sin embargo es posible ejecutar C# de forma similar a un lenguaje de Scripting, para realizar pequeños programas que ejecuten una acción. Para ello aprovecharemos que los programas den .NET pueden ser compilados a través de la consola de comandos sin mayor dificultad.

En la entrada de hoy vamos a ver un pequeño truco para envolver un código de C# dentro de un fichero .bat de forma que se auto ejecute, sin necesidad de proporcionar un fichero compilado .exe.

Algo que, sinceramente, tampoco es que vayamos a hacer todos los días. Pero que, en ciertas ocasiones, puede resultar úti.

Básicamente lo que hace este fichero es ejecutar los pasos que reiniciaremos para e instalarlo de forma automática por nosotros

// 2>nul||@goto :batch
/*
:batch
@echo off
setlocal
rem del /q /f "%~n0.exe" >nul 2>nul
:: find csc.exe
set "csc="
for /r "%SystemRoot%\Microsoft.NET\Framework\" %%# in ("*csc.exe") do  set "csc=%%#"

if not exist "%csc%" (
   echo no .net framework installed
   exit /b 10
)

if not exist "%~n0.exe" (
   call %csc% /nologo /warn:0 /out:"%~n0.exe" "%~dpsfnx0" || (
      exit /b %errorlevel% 
   )
)
%~n0.exe %*
endlocal & exit /b %errorlevel%
*/

using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Collections.Generic;

public class SelfContainer {

    public static void Main(String[] args)
    {
        var myVariable = 2 + 2;
        Console.WriteLine("Run from bat " + myVariable);
    }
}

Donde simplemente tenemos que sustituir en el fichero el contenido de la función Main por el código que nosotros queramos ejecutar.

El fichero funciona mediante un truco muy ingenioso, jugando con la etiqueta @goto y los comentarios de C#. En una primera ejecución como fichero .bat, la directiva @goto redirecciona a la parte superior del fichero.

Aquí se realiza la compilación del propio fichero. Al estar las partes del fichero bat comentadas para c#, el compilador ignora esta parte compilando únicamente la parte inferior del fichero y ejecutándolo.

Evidentemente pues podéis guardar este código como template y, si alguna vez lo necesitáis, simplemente tenéis que sustituir el código del Main vuestro no es necesario acordarse de todo porque