Вы должны войти, чтобы создавать сообщения и темы.

C# Компилятор на лету

Всем привет!
Сделал маленький runtime компилятор.
Суть работы: в textBox пишите код С# который Вам нужен и жмёте на кнопку Compile.
После чего на рабочем столе появляется сгенерированный .exe который будет исполнять именно тот код, который вы написали в textBox.

Скрин

Видео, как это работает

Скачать компилятор

Лайкнули Arman, Дмитрий и ещё 8
ArmanДмитрийYevheniiMak0013АлександрAlekseyvbЕвгенийЗахарOnePunchMan

Приветствую.

А ссылки не осталось на эту программулину? И нет ли исходников на неё? Вижу что Portable Creator сделан из этого, мне интересен сам принцип, ну и хочется из него сделать прогу маленькую для работы с браузером. Типа для передачи ссылки в проги, например в yt-dlp или potplayer (понятно что есть уже подобные, но они либо на node, python, либо если на с#, то кривые, как вот этот вариант https://extpose.com/ext/561 там внутри есть лаунчер, в установщике можно вытащить посмотреть.)

https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage
https://developer.chrome.com/docs/apps/nativeMessaging/
https://github.com/acandylevey/NativeMessaging вот и библа есть готовая

ну или если исходники не хочешь выкладывать, может сам сделаешь маленький nativeApp? самое главное это из расширений отправка сообщения, отправляет

chrome.runtime.sendNativeMessage(
  application:
  string,
  message:
  object,
  callback?:
  function,
)

и в nativeApp чтобы правильно эту строку сообщения отправляло в cmd. Т.е. если в строке есть текст в двойных кавычках, чтобы этот текст так вместе с кавычками и отправлялся в cmd
вот тестовая расширка https://chromium.googlesource.com/chromium/src.git/+/62.0.3178.1/chrome/common/extensions/docs/examples/api/nativeMessaging/app/
https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging а вот инфа как прописать json и в реестр чтобы браузер его запускал

Пардон, там же этого всего не нужно, надо было у гугла или ютуба спросить 😉

QZMTCH,  Привет.

Цитата: QZMTCH от 04.01.2024, 02:21

Типа для передачи ссылки в проги, например в yt-dlp или potplayer...

Мне интересно, у тебя задача какая? Если просто вставить быстро ссылки, то это проще скриптом, через свои "shortcuts". Просто у меня уже  есть готовые. Достаточно скопировать строку в системный буфер обмена. Затем свои горячие клавиши, какие удобно. Если задача просто ускорить этот процесс.

Цитата: Viсtor от 06.02.2024, 19:23

QZMTCH,  Привет.

Цитата: QZMTCH от 04.01.2024, 02:21

Типа для передачи ссылки в проги, например в yt-dlp или potplayer...

Мне интересно, у тебя задача какая? Если просто вставить быстро ссылки, то это проще скриптом, через свои "shortcuts". Просто у меня уже  есть готовые. Достаточно скопировать строку в системный буфер обмена. Затем свои горячие клавиши, какие удобно. Если задача просто ускорить этот процесс.

Привет. Задача такая как выше написал, передавать ссылку в прогу, которая будет вызывать другие проги, типа как эта https://extpose.com/ext/561 У этого варианта косяк с отправкой какой то. С ней норм только если только ссылку отправлять и всё, без доп инфы, ключей запуска например для проги. На батничек можно путь в расширении прописать, и уже там всё обрабатывать.
Типа такого 

yt-dlp.exe --no-part -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best" -P temp:"C:\\Temp" -P home:"D:\\video\\yt-dlp" -o "%%(title)s.%%(ext)s" %*
pause

 

Но надо всё таки своё как нибудь написать, да всё времени нет
В расширении просто можно написать дополнительно свои парсеры чего нибудь. Типа названия, описания, картинки, или ещё чего, и не только для yt-dlp, а для любой проги

QZMTCH, 👋 Если тебе нужен конвейер, тебе придется разбираться в API браузера. Тут к сожалению не помогу. А вот если надо максимально упростить себе задачу с тем же yt-dlp или Potplayer это не сложно. Я тут оставлю свой вариант, возможно пригодится кому-нибудь.

Я пользуюсь "своими" горячими клавишами. Напомню это те, что можно установить на созданном ярлыке. Ярлыки работают, для клавиш на рабочем столе, в подпапках рабочего стола, и некоторых других директориях. Например у меня это находится в C:\Users\Vikto\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\MyShortcuts . В ней находится папка yt-dlpData, собственно сама программа. В ней еще 3 папки script,ffmpeg(туда скачен),downloads. А также в этой папке создан файл конфигурации Config.cnf в нем указал

--ffmpeg-location ./ffmpeg/bin/ffmpeg.exe
--output ./downloads/%(title)s.%(ext)s
--format bestvideo*+bestaudio/best
--concurrent-fragments 16 // на любителя можно и без этого
--http-chunk-size 8M //  на любителя можно и без этого

Дальше нужно зайти в пустую папку script и создать сам скрипт у меня называется yt-dlpClipboard.vbs вот содержимое:

If InStr(1, WScript.FullName, "wscript.exe", vbTextCompare) > 0 Then
With CreateObject("WScript.Shell")
WScript.Quit .Run("cscript.exe """ & WScript.ScriptFullName & """", 0, True)
End With
End If


Set objShell = CreateObject("WScript.Shell")
strURL = objShell.Exec("powershell.exe -command ""Get-Clipboard""").StdOut.ReadAll


Dim regEx
Set regEx = New RegExp
regEx.Pattern = "^\s+$"

If Len(strURL) > 0 And Not regEx.Test(strURL) Then
objShell.Run """C:\Users\Vikto\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\MyShortcuts\yt-dlpData\yt-dlp.exe"" " & strURL & " --config-location Config.cnf", 1, False
End If

Я VBS не знаю, собрал "на коленке". Кратко по скрипту:

  • Первый абзац отвечает за перезапуск скрипта в скрытом режиме. Необходимо чтобы всякие окна консоли не мелькали на панели задач.
  • Просто получаю строку из буфера обмена, через Shell через поток вывода.
  • Далее абзац связан с тем у меня не получилось из за кодировки просто проверить длину, да и не важно.
  • Дальше проверяется что строка входящая не пустая.
  • В конце идет вызов через objShell.Run собственно программы с передачей аргументов. Единица в конце строки отвечает за то чтобы окно консоли yt-dlp не было скрыто.

Логика простоая заходиш на странцу с видео копируешь в буфер обмено строку. Потом вызываешь скрипт "Сочитанием горячих клавиш".
Чтобы это сделать нужно создать ярылык на этот скрипт. Я для удобства сортировки поместл его в корневую папку "MyShortcuts". Заходиш в свойста ярлыка, нажимаешь на поле быстрый вызов, выстваляешь свои горячие клавиши. У меня например это Shift + Alt + Num(это плюс на лампад клавиатуре).

То же подход и для potplayer.

If InStr(1, WScript.FullName, "wscript.exe", vbTextCompare) > 0 Then
With CreateObject("WScript.Shell")
WScript.Quit .Run("cscript.exe """ & WScript.ScriptFullName & """", 0, True)
End With
End If


Set objShell = CreateObject("WScript.Shell")
strURL = objShell.Exec("powershell.exe -command ""Get-Clipboard""").StdOut.ReadAll


Dim regEx
Set regEx = New RegExp
regEx.Pattern = "^\s+$"

If Len(strURL) > 0 And Not regEx.Test(strURL) Then
objShell.Run """C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe"" " & strURL & " /clipboard", 0, False
End If

Разница только в цире 0 в конце objShell.Run, и в это раз показ консоли не интересен. Логика как в первом случаи.

Пару скринов

Лайкнул Sergey
Sergey

очень много лишнего, у меня в центе так стоит скрин. Батник запускается просто потому что не получилось прописать команду с powershell, почему то название не раскрывается, не с запуска из cmd /c или /k ни просто powershell, ни кавычки, всё перепробовал не получилось короче написать. И через mshta в одну строку закладки не прописать правильно чтобы заработало. А батник работает, конфиг рядом или внутрь ключи и норм
https://www.centbrowser.net/en/showthread.php?tid=1449
ps а ну и батник сам

for /f "delims=" %%i in ('mshta "javascript:var x=clipboardData.getData('text');if(x) new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(x);close();"') do yt-dlp.exe -o "C:\Users\qzmtch\Desktop\%%(title)s.%%(ext)s" %%i
pause

 

Лайкнул Sergey
Sergey

pss а нафига тебе vbs если ты из буфера в powershell берёшь ссылку, и потом больше ничего особо не делаешь в vbs? можно же просто бат тогда написать

QZMTCH, Пока разобрался о чём речь 😀. Как я понял тебе почему-то интересна фича, которая позволяет запускать cmd из закладки Сent browser. Насколько я понял, это только в Сent и работает. У меня более универсальный подход. Достаточно поместить нужную строку в буфер обмена. Формат .bat не используется по очевидным причинам - зачем мне на экране, или на панели задач мелькающие окна. Мне не известно способа запуска самих .bat в таком режиме "штатными" средствами. С mshta пока не доводилось сталкиваться. Тут просто демонстрация, что подход рабочий - https://youtu.be/DT6Jx8JvFkY

Цитата: Viсtor от 15.02.2024, 18:58

QZMTCH, Пока разобрался о чём речь 😀. Как я понял тебе почему-то интересна фича, которая позволяет запускать cmd из закладки Сent browser. Насколько я понял, это только в Сent и работает. У меня более универсальный подход. Достаточно поместить нужную строку в буфер обмена. Формат .bat не используется по очевидным причинам - зачем мне на экране, или на панели задач мелькающие окна. Мне не известно способа запуска самих .bat в таком режиме "штатными" средствами. С mshta пока не доводилось сталкиваться. Тут просто демонстрация, что подход рабочий - https://youtu.be/DT6Jx8JvFkY

 Вот и я хочу более универсальный, но без буфера, потому что расширением можно передавать сразу и ссылку и какое нибудь название, описание, картинку или ещё чего нибудь. У меня есть и вариант для всех
просто создаёшь протокол 
такой

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\ytdlp]
"URL Protocol"=""

[HKEY_CLASSES_ROOT\ytdlp\DefaultIcon]
@="\"C:\\Windows\\yt-dlp.exe,0\""

[HKEY_CLASSES_ROOT\ytdlp\shell]

[HKEY_CLASSES_ROOT\ytdlp\shell\open]

[HKEY_CLASSES_ROOT\ytdlp\shell\open\command]
@="\"C:\\Windows\\yt-dlp.exe\" \"%1\""

или такой

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\ytdlp]
"URL Protocol"=""

[HKEY_CLASSES_ROOT\ytdlp\DefaultIcon]
@="\"C:\\Windows\\yt-dlp.exe\""

[HKEY_CLASSES_ROOT\ytdlp\shell]

[HKEY_CLASSES_ROOT\ytdlp\shell\open]

[HKEY_CLASSES_ROOT\ytdlp\shell\open\command]
@="\"C:\\Users\\QZMTCH\\Desktop\\d.cmd\" \"%1\""

второй поудобней
потом bat 

chcp 65001
set "arg="%*"
set "arg=%arg:~10%"
set "arg=%arg:~,-1%"
"C:\Windows\yt-dlp.exe" -o "C:\Users\qzmtch\Desktop\%%(title)s.%%(ext)s" "%arg%"
pause

и так же букмарклет в закладки
Скопированоjavascript:location.href='ytdlp://'+location.href
Но хочется расширение. Чтобы в нативное приложение передавало то, что хочется, и запускало то, что хочется. С разными вариантами. Можно конечно батниками это всё порешать разными. Или в один напихать всё и с аргументами просто вызывать его, но это не то.

К сожалению создавать закладки, с чем-то помимо стандартных протоколов нельзя в большинстве браузеров, т.е может быть где-то и можно, но из отсутствия возможности использования скрипта, не получится снабдить строку динамической полезной нагрузкой. Мне кажется наиболее разумный подход, это создание расширения для браузера, как ты ранее упоминал. После совещания с СhatGPT =), прояснил для себя следующее. Нужно зарегистрировать нативное приложение в СкопированоNative Messaging Host, указав путь для запуска, и там же указать либо протокол, либо идентификатор. В обоих подходах данные передаются в СкопированоStdin, например то же Json, но в варианте с протоколом, строка самого протокола, куда можно поместить полезную нагрузку, так же передаётся, как входной аргумент. Могу ошибаться. Вычитываются с СкопированоStdout. Завершение процесса сигнализирует о конце полезной нагрузки, и результат возвращается, как обратный вызов метода. Вариант удобен тем, что обеспечивает обратную связь с расширением штатным образом. Данный подход интересен тем, что позволяет интерактивно в браузере выбрать, то что ты хочешь извлечь. В ином случаи, я бы выбрал простой парсинг через приложение.

Цитата: Viсtor от 16.02.2024, 07:25

К сожалению создавать закладки, с чем-то помимо стандартных протоколов нельзя в большинстве браузеров

Буркмарклеты такие везде работают с древних времён, нет такого что не работает этот вариант

Нужно зарегистрировать нативное приложение в СкопированоNative Messaging Host, указав путь для запуска, и там же указать либо протокол, либо идентификатор. В обоих подходах данные передаются в СкопированоStdin, например то же Json, но в варианте с протоколом, строка самого протокола, куда можно поместить полезную нагрузку, так же передаётся, как входной аргумент. Могу ошибаться. Вычитываются с СкопированоStdout. Завершение процесса сигнализирует о конце полезной нагрузки, и результат возвращается, как обратный вызов метода. Вариант удобен тем, что обеспечивает обратную связь с расширением штатным образом. Данный подход интересен тем, что позволяет интерактивно в браузере выбрать, то что ты хочешь извлечь. В ином случаи, я бы выбрал простой парсинг через приложение.

Так и я про тоже, я это всё уже знаю, и ссылки выше же есть на документацию. Это всё я понял и без чатов. Просто времени нет разобраться. Варианты на С# есть, так же есть и расширение. Можно даже тоже самое использовать, или по своему его переписать, но времени нет. Хотя знающему человеку чтобы написать его (нативное приложение, которое будет то что пришло от расширения отправлять в cmd) надо пару минут, а если дополнить своими if для разных прог с разными ключами запуска пару десятков минут. Ну как время появится пойду пробовать 😉

Лайкнул Viсtor
Viсtor

Здравствуйте.
Замечательная программа, спасибо, что делитесь вашим творчеством.
Жаль ссылка для скачивания не работает. Если не сложно перезалейте пожалуйста🙏

Лайкнул Павел
Павел