вторник, 25 февраля 2020 г.

Как скомпилировать C# код из батника

Я тут пока рылся в интернете в поисках скрипта для сохранения скриншотов, и в одном из топиков stackoverflow наткнулся на интересный код: этот скрипт bat, который при запуске создает экзешник - программу для автоматического сохранения скриншотов. Фишка в том ,что это реально получается компилятор кода C# из батника.

В общем не буду ходить вокруг да около, а просто оставлю ссылку на этот код:
https://github.com/npocmaka/batch.scripts/blob/master/hybrids/.net/c/screenCapture.bat

Программа на выходе умеет сохранять скриншот целиком экрана, либо определенного окна на экране. Сохранять может в нескольких форматах. Весит немного, работает быстро и четко и конечно же, снова напомню, программа компилится из батника! В эту программу можно добавить спокойно любой свой код, и снова перекомпилировать и все будет работать (возможно). Я, например, заметил что на скришотах видно консоль полупрозрачную - потомучто прога запускается из консоли и потому эта консоль не успевает убраться во время съемки экрана. Чтобы немного улучшить вид скриншота, я просто уменьшил окно консоли, добавив в код Console.SetWindowSize(1, 1);

Конечно же было интересно способен ли такой батник компилить другой код, и я скажу вам  - он способен. Я удалил основную программу и оставил только то что идет ниже

// 2>nul||@goto :batch
/*
:batch
@echo off
setlocal

:: 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 /r:"Microsoft.VisualBasic.dll" /out:"%~n0.exe" "%~dpsfnx0" || (
      exit /b %errorlevel% 
   )
)
%~n0.exe %*
endlocal & exit /b %errorlevel%

*/
// reference  
// https://gallery.technet.microsoft.com/scriptcenter/eeff544a-f690-4f6b-a586-11eea6fc5eb8

using System;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections.Generic;
using Microsoft.VisualBasic;

public class playsound
{

    public static void Main()
    {

    }
}

В main добавил код музыки HappyBirthday и она заиграла)
Думаю что можно спокойно компилить и другие проги. Конечно же не без ограничений, но тем не менее. Мне очень понравилось, что можно писать прогу (в моем случае тупо копировать из инета, как всегда) не имея специальных сред для разработки.

1 комментарий:

  1. System.Console.Beep(264, 125);
    System.Threading.Thread.Sleep(250);
    System.Console.Beep(264, 125);
    System.Threading.Thread.Sleep(125);
    System.Console.Beep(297, 500);
    System.Threading.Thread.Sleep(125);
    System.Console.Beep(264, 500);
    System.Threading.Thread.Sleep(125);
    System.Console.Beep(352, 500);
    System.Threading.Thread.Sleep(125);
    System.Console.Beep(330, 1000);
    System.Threading.Thread.Sleep(250);
    System.Console.Beep(264, 125);
    System.Threading.Thread.Sleep(250);
    System.Console.Beep(264, 125);
    System.Threading.Thread.Sleep(125);
    System.Console.Beep(297, 500);
    System.Threading.Thread.Sleep(125);
    System.Console.Beep(264, 500);
    System.Threading.Thread.Sleep(125);
    System.Console.Beep(396, 500);
    System.Threading.Thread.Sleep(125);
    System.Console.Beep(352, 1000);
    System.Threading.Thread.Sleep(250);
    System.Console.Beep(264, 125);
    System.Threading.Thread.Sleep(250);
    System.Console.Beep(264, 125);
    System.Threading.Thread.Sleep(125);
    System.Console.Beep(264, 500);
    System.Threading.Thread.Sleep(125);
    System.Console.Beep(440, 500);
    System.Threading.Thread.Sleep(125);
    System.Console.Beep(352, 250);
    System.Threading.Thread.Sleep(125);
    System.Console.Beep(352, 125);
    System.Threading.Thread.Sleep(125);
    System.Console.Beep(330, 500);
    System.Threading.Thread.Sleep(125);
    System.Console.Beep(297, 1000);
    System.Threading.Thread.Sleep(250);
    System.Console.Beep(466, 125);
    System.Threading.Thread.Sleep(250);
    System.Console.Beep(466, 125);
    System.Threading.Thread.Sleep(125);
    System.Console.Beep(440, 500);
    System.Threading.Thread.Sleep(125);
    System.Console.Beep(352, 500);
    System.Threading.Thread.Sleep(125);
    System.Console.Beep(396, 500);
    System.Threading.Thread.Sleep(125);
    System.Console.Beep(352, 1000);
    System.Threading.Thread.Sleep(125);

    ОтветитьУдалить