C# как скриптовый язык для мелких утилит...
От: Shmj Ниоткуда  
Дата: 18.01.23 19:38
Оценка: +2
Оставлю это тут для себя:

1. Создаем в папке мелкой утилиты Run.ps1 -файл с таким содержимым:

$srcFiles = Get-ChildItem "./*.cs" | select FullName

$sb = [System.Text.StringBuilder]::new()

[void]$sb.AppendLine(@'
using System;
using System.Net;

'@)

foreach ($srcFile in $srcFiles)
{
    $lines = (Get-Content $srcFile.FullName -Raw).Split([Environment]::NewLine)
  
    foreach ($line in $lines)
    {
        if ($line -match '^[ \t]*using [a-zA-Z0-9_.]+;.*$')
        {
            continue;
        }

        [void]$sb.AppendLine($line);
    }
}

$code = $sb.ToString()
Add-Type -TypeDefinition $code -Language CSharp

[MyNamespace1.Program]::Main("")
Pause


2. В самом скрипте указываем все using-и и вместо MyNamespace1 пространство имен вашей консольной утилиты. Класс Program и Main должны быть public.

3. Теперь легким движением руки наша утилита превратилась в скриптовую — можно менять без перекомпиляции и даже на машине без студии...

Хотя... Оно все-таки компилит это дело, как я понял. Так что смысл не большой.
Отредактировано 19.01.2023 6:41 Shmj . Предыдущая версия . Еще …
Отредактировано 18.01.2023 20:02 Shmj . Предыдущая версия .
Отредактировано 18.01.2023 19:55 Shmj . Предыдущая версия .
Отредактировано 18.01.2023 19:39 Shmj . Предыдущая версия .
powershell
Re: C# как скриптовый язык для мелких утилит...
От: vaa  
Дата: 19.01.23 01:22
Оценка:
Здравствуйте, Shmj, Вы писали:

Оставлю это тут для себя:

создаем файл hello.fsx (F# script — ! сейчас вроде еще добавилось расширение типа .fscript или .fscripts)

#!/usr/bin/env -S dotnet fsi --exec
#load "Utils.fsx"
#r "nuget: FSharp.Data"
open type FSharp.Data.Http
let item = RequestString "https://rsdn.org/Forum/NewMsg.aspx?mid=8451450"
printfn $"message with id 8451450 has text '{item}'"


в винде делаем ассоциацию с "dotnet fsi"
в линуксе даем права на выполнение chmod +x hello.fsx
или просто запускаем через dotnet fsi hello.fsx

или просто запускаем dotnet fsi (интерактивный режим) и балуемся:
> open System;;
> DateTime.Now;;
val it: DateTime = 19.01.2023 8:21:21 {Date = 19.01.2023 0:00:00;
                                       Day = 19;
                                       DayOfWeek = Thursday;
                                       DayOfYear = 19;
                                       Hour = 8;
                                       Kind = Local;
                                       Microsecond = 354;
                                       Millisecond = 104;
                                       Minute = 21;
                                       Month = 1;
                                       Nanosecond = 300;
                                       Second = 21;
                                       Ticks = 638097132811043543L;
                                       TimeOfDay = 08:21:21.1043543;
                                       Year = 2023;}
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: C# как скриптовый язык для мелких утилит...
От: vmpire Россия  
Дата: 19.01.23 09:31
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Оставлю это тут для себя:


S>3. Теперь легким движением руки наша утилита превратилась в скриптовую — можно менять без перекомпиляции и даже на машине без студии...


Ещё довольно давно есть штатная утилита csi.exe, которая не только может исполнять файлы без компиляции, но ещё и REPL реализует
Re: C# как скриптовый язык для мелких утилит...
От: Mr.Delphist  
Дата: 19.01.23 10:21
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>3. Теперь легким движением руки наша утилита превратилась в скриптовую — можно менять без перекомпиляции и даже на машине без студии...


S>Хотя... Оно все-таки компилит это дело, как я понял. Так что смысл не большой.


Вот первый вопрос был про буханку и троллейбус. Можно, но зачем? Если того же проще достичь через батник с курлом и прочими поэтессами, то к чему велосипедить.
Re[2]: C# как скриптовый язык для мелких утилит...
От: vaa  
Дата: 19.01.23 23:44
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Здравствуйте, Shmj, Вы писали:


S>>Оставлю это тут для себя:


S>>3. Теперь легким движением руки наша утилита превратилась в скриптовую — можно менять без перекомпиляции и даже на машине без студии...


V>Ещё довольно давно есть штатная утилита csi.exe, которая не только может исполнять файлы без компиляции, но ещё и REPL реализует

Точно штатная?
C:\Users\nn>dir c:\csi.exe /s /b
c:\Users\nn\.vscode\extensions\.f72c903a-3b1b-4024-8dc8-ca0fe2cfed4a\.omnisharp\1.38.2\.msbuild\Current\Bin\Roslyn\csi.exe
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: C# как скриптовый язык для мелких утилит...
От: DiPaolo Россия  
Дата: 20.01.23 03:37
Оценка:
Ужоснах

Открой для себя питон.
Патриот здравого смысла
Re: C# как скриптовый язык для мелких утилит...
От: vlp  
Дата: 20.01.23 03:48
Оценка: 9 (2) +1
чот слишком сложно.

создаем и запускаем bat-файл, внутри можно просто писать на C#
/* 2> nul
@echo off
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;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.IO;

public class Program { 
static void Main(string[] args)
{
       Console.Write("Hello, world");
}}
Re: C# как скриптовый язык для мелких утилит...
От: sqrt  
Дата: 20.01.23 06:43
Оценка: +1
Здравствуйте, Shmj, Вы писали:

dotnet tool install -g dotnet-script

mkdir test
cd test

dotnet-script init
Re: C# как скриптовый язык для мелких утилит...
От: vaa  
Дата: 20.01.23 07:59
Оценка:
Здравствуйте, Shmj, Вы писали:
Еще в копилку:

//run_timer.d
import std.datetime.stopwatch;
import std.stdio;
import std.process;

void main (string[] args) {
//    foreach(e; args) writeln("arg = ", e);
    auto sw = StopWatch(AutoStart.no);
    sw.start();
        auto dmd = execute(args[1 .. $]);
        writeln (dmd.status);
    sw.stop();

    long msecs = sw.peek.total!"msecs";
    writeln("msecs = ", msecs);
}


rdmd run_timer.d dotnet fsi --exec test.fsx


корка 7.0.102
пустой скрипт 2000 мс. с printfn 2600, ссылка на нугет 6782, нугет с опре версией(загружен) 3712

PS если заменить запуск процесса на распечатку аргументов, то вообще отрабатывает мгновенно.
PS2 не кажется ли вам, что скорость загрузки вот этих вот powershell, c#, f# скриптов недопустимо медленной?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Отредактировано 20.01.2023 8:06 Разраб . Предыдущая версия . Еще …
Отредактировано 20.01.2023 8:03 Разраб . Предыдущая версия .
Re[3]: C# как скриптовый язык для мелких утилит...
От: vmpire Россия  
Дата: 20.01.23 10:18
Оценка:
Здравствуйте, vaa, Вы писали:

V>>Ещё довольно давно есть штатная утилита csi.exe, которая не только может исполнять файлы без компиляции, но ещё и REPL реализует

vaa>Точно штатная?
vaa>C:\Users\nn>dir c:\csi.exe /s /b
vaa>c:\Users\nn\.vscode\extensions\.f72c903a-3b1b-4024-8dc8-ca0fe2cfed4a\.omnisharp\1.38.2\.msbuild\Current\Bin\Roslyn\csi.exe
Ну у меня она в "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn\csi.exe"
Входит в поставку VS2019 и, наверное, других версий.
Re[2]: C# как скриптовый язык для мелких утилит...
От: Osaka  
Дата: 20.01.23 12:19
Оценка:
vlp>%csc% /nologo /out:"%~dpnx0.exe" "%~dpnx0"
/debug:full
Вот если бы ещё научить его по брыкпоинтам выходить в отладчик...
Re[3]: C# как скриптовый язык для мелких утилит...
От: vlp  
Дата: 20.01.23 15:38
Оценка:
Здравствуйте, Osaka, Вы писали:

vlp>>%csc% /nologo /out:"%~dpnx0.exe" "%~dpnx0"

O>/debug:full
O>Вот если бы ещё научить его по брыкпоинтам выходить в отладчик..

System.Diagnostics.Debugger.Break();
Отредактировано 20.01.2023 15:39 vlp . Предыдущая версия . Еще …
Отредактировано 20.01.2023 15:39 vlp . Предыдущая версия .
Re[4]: C# как скриптовый язык для мелких утилит...
От: vaa  
Дата: 21.01.23 01:02
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Здравствуйте, vaa, Вы писали:


V>>>Ещё довольно давно есть штатная утилита csi.exe, которая не только может исполнять файлы без компиляции, но ещё и REPL реализует

vaa>>Точно штатная?
vaa>>C:\Users\nn>dir c:\csi.exe /s /b
vaa>>c:\Users\nn\.vscode\extensions\.f72c903a-3b1b-4024-8dc8-ca0fe2cfed4a\.omnisharp\1.38.2\.msbuild\Current\Bin\Roslyn\csi.exe
V>Ну у меня она в "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn\csi.exe"
V>Входит в поставку VS2019 и, наверное, других версий.
у меня 2022.
нет.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: C# как скриптовый язык для мелких утилит...
От: vmpire Россия  
Дата: 21.01.23 13:09
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>>>Точно штатная?

vaa>>>C:\Users\nn>dir c:\csi.exe /s /b
vaa>>>c:\Users\nn\.vscode\extensions\.f72c903a-3b1b-4024-8dc8-ca0fe2cfed4a\.omnisharp\1.38.2\.msbuild\Current\Bin\Roslyn\csi.exe
V>>Ну у меня она в "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn\csi.exe"
V>>Входит в поставку VS2019 и, наверное, других версий.
vaa>у меня 2022.
vaa>нет.
vs 2022 вся из себя 64-битная. В ней у меня тоже есть: C:\Program Files\Microsoft Visual Studio\2022\Community\Msbuild\Current\Bin\Roslyn\csi.exe
Re[2]: C# как скриптовый язык для мелких утилит...
От: _NN_ www.nemerleweb.com
Дата: 21.01.23 22:11
Оценка: 2 (1)
Здравствуйте, vaa, Вы писали:

vaa>PS2 не кажется ли вам, что скорость загрузки вот этих вот powershell, c#, f# скриптов недопустимо медленной?

Так и есть.
Тут подсказывают, что F Sharp Interactive вообще не предназнался для этих целей, а посему время запуска особо никого не беспокоит.

Как вариант собрать и закешировать через
fake -s run helloworld.fsx
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: C# как скриптовый язык для мелких утилит...
От: vaa  
Дата: 22.01.23 01:32
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Здравствуйте, vaa, Вы писали:


vaa>>PS2 не кажется ли вам, что скорость загрузки вот этих вот powershell, c#, f# скриптов недопустимо медленной?

_NN>Так и есть.
_NN>Тут подсказывают, что F Sharp Interactive вообще не предназнался для этих целей, а посему время запуска особо никого не беспокоит.

--exec Выход из FSI после загрузки файлов или выполнение скрипта .fsx, указанного в
командной строке

Это некто филлип картер он на мств занимается рекламой фарша. дон сайм(главный архитектор фарша) этого не говорит.
лень искать, но даже в оф руководствах приводится как линукс добавить хэшбанг чтобы удобнее и командной строки запускать.
наверно не для того чтобы заниматься интерактивной разработкой.
тут проблема скореее всего в жирном рантайме и предкомпиляции. кстати сама утилита dotnet похоже написана не на дотнете)))


_NN>Как вариант собрать и закешировать через
fake -s run helloworld.fsx

не уверен что это лучше, добавляем еще одну стадию загрузки.
вообще, было бы идеально статик-компиляция,и чтобы сборку попадали только те функции что
реально используются.
так как это делается в некоторых языках. так вроде умел турбопаскаль.
или вот node js при сборке бандла умеет выкинуть все лишнее.
я так поминаю, загрузка dll это не только файл прочитать.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Отредактировано 22.01.2023 6:47 Разраб . Предыдущая версия .
Re[4]: C# как скриптовый язык для мелких утилит...
От: _NN_ www.nemerleweb.com
Дата: 22.01.23 09:38
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>тут проблема скореее всего в жирном рантайме и предкомпиляции. кстати сама утилита dotnet похоже написана не на дотнете)))

Не угадали: https://github.com/dotnet/sdk/tree/main/src/Cli/dotnet

vaa>не уверен что это лучше, добавляем еще одну стадию загрузки.

vaa>вообще, было бы идеально статик-компиляция,и чтобы сборку попадали только те функции что
vaa>реально используются.
vaa>так как это делается в некоторых языках. так вроде умел турбопаскаль.
vaa>или вот node js при сборке бандла умеет выкинуть все лишнее.
vaa>я так поминаю, загрузка dll это не только файл прочитать.
Это надо сначала в приоритете чтобы было.
Вон PowerShell начал запускаться более менее быстро когда начали переписывать и позиционировать как оболочку для скриптов.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: C# как скриптовый язык для мелких утилит...
От: vaa  
Дата: 23.01.23 02:54
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Здравствуйте, vaa, Вы писали:


vaa>>тут проблема скореее всего в жирном рантайме и предкомпиляции. кстати сама утилита dotnet похоже написана не на дотнете)))

_NN>Не угадали: https://github.com/dotnet/sdk/tree/main/src/Cli/dotnet
Прикольно!
  <AssemblyName>dotnet</AssemblyName>
    <OutputType>Exe</OutputType>
    <StrongNameKeyId>MicrosoftAspNetCore</StrongNameKeyId>

MicrosoftAspNetCore!!! Получается изначально так и планировали — только веб?

_NN>Это надо сначала в приоритете чтобы было.

_NN>Вон PowerShell начал запускаться более менее быстро когда начали переписывать и позиционировать как оболочку для скриптов.
Блин, ну так и FSI так позиционировали. к тому же у фарша компилятор свой, с 2006 года принципиально не менялся, как fsi.
надо сказать в старом дотнете все гораздо шустрее стартовало.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[4]: C# как скриптовый язык для мелких утилит...
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.01.23 08:50
Оценка:
Здравствуйте, vaa, Вы писали:


vaa>вообще, было бы идеально статик-компиляция,и чтобы сборку попадали только те функции что

Ну так сейчас же есть обрезка. В Xamarin режет все. https://learn.microsoft.com/ru-ru/dotnet/core/deploying/trimming/trim-self-contained

Кстати Блазор в первой версии был интерпретатором байт кода. А в байт код компилируется быстро.
и солнце б утром не вставало, когда бы не было меня
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.