Выполнить си шарп из переменной

Axel

Client
Регистрация
20.03.2017
Сообщения
176
Реакции
10
Баллы
18
Как правильно выполнить запрос C#
В переменной лежит код, я ставлю в кубик C# вот так

2026-09-25_1-14-32.png

И на любой код выполнение с ошибкой

2026-09-25_1-14-42.png

Подскажите что делаю не так. Поиск не помог, может плохо искал.
 
Насколько помню, никак. Код компилируется при запуске шаблона, а не в процессе его работы.
Ну, это если опустить момент с отсутствием ; в конце строки.
 
Как правильно выполнить запрос C#
В переменной лежит код, я ставлю в кубик C# вот так

Посмотреть вложение 143997

И на любой код выполнение с ошибкой

Посмотреть вложение 143998

Подскажите что делаю не так. Поиск не помог, может плохо искал.
Вам пишет что нет ;
 
  • Оценить
Реакции: Dmitriy_Zenno
Как правильно выполнить запрос C#
В переменной лежит код, я ставлю в кубик C# вот так

Посмотреть вложение 143997

И на любой код выполнение с ошибкой

Посмотреть вложение 143998

Подскажите что делаю не так. Поиск не помог, может плохо искал.
Здравствуйте,

Если вы работаете с C#-кодом и в нем есть ошибка компиляции, выполнение других кубиков будет невозможно, пока ошибка не будет исправлена.

В вашем случае вы забыли поставить ; в конце строки.

Чтобы быстро найти проблемный кубик, дважды кликните по ошибке в логе. PM автоматически перейдет к нему и подсветит его.
 
Здравствуйте,

Если вы работаете с C#-кодом и в нем есть ошибка компиляции, выполнение других кубиков будет невозможно, пока ошибка не будет исправлена.

В вашем случае вы забыли поставить ; в конце строки.

Чтобы быстро найти проблемный кубик, дважды кликните по ошибке в логе. PM автоматически перейдет к нему и подсветит его.
Думаю, что вопрос не в пропущенной точке с запятой. У него в переменной проекта лежит снипет на c#, который он хочет налету передать в кубик c# и выполнить его.

@Axel Скорее всего никак, т.к. после первичного запуска шаблона код уже не будет компилироваться на лету. Он компилируется один раз после нажатия на кнопку Старт.
 
Думаю, что вопрос не в пропущенной точке с запятой. У него в переменной проекта лежит снипет на c#, который он хочет налету передать в кубик c# и выполнить его.

@Axel Скорее всего никак, т.к. после первичного запуска шаблона код уже не будет компилироваться на лету. Он компилируется один раз после нажатия на кнопку Старт.
Если очень надо - варианты есть.
Вот к примеру была тема, в которой показано как компилировать код внутри шаблона, но это определенные сложности, из-за которых автору скорее всего такой вариант не подойдет:
Код:
Развернуть Свернуть Копировать
https://zenno.club/discussion/threads/kak-ya-podruzhil-zennoposter-s-lokal-nym-ii-i-on-sam-nachal-chinit-moi-skripty.131970/
 
Последнее редактирование:
Если очень надо - варианты есть.
Вот к примеру была тема, в которой показано как компилировать код внутри шаблона, но это определенные сложности, из-за которого автору скорее всего такой вариант не подойдет:
Код:
Развернуть Свернуть Копировать
https://zenno.club/discussion/threads/kak-ya-podruzhil-zennoposter-s-lokal-nym-ii-i-on-sam-nachal-chinit-moi-skripty.131970/
Спасибо за ссылку. Идея интересная у автора, но сам принцип напиши 2000 строк кода в кубике и потом пытайся найти ошибки с помощью ИИ - не очень)
Из-за разнапёрово оформления статьи было тяжело, но я бегло изучил её и для автора топика скопировал код, который возможно ему поможет, но лучше он конечно пусть сам её прочтет:

C#:
Развернуть Свернуть Копировать
string csFile    = @"C:\AI Code Sherlock\zp_scripts\signal_handler.cs";
string methodName = "ReadRequest"; // ← меняй: ReadRequest / QueryOllama / WriteResponse

// Читаем исходник
string sourceCode = System.IO.File.ReadAllText(csFile, System.Text.Encoding.UTF8);

// Компилируем
var provider = new Microsoft.CSharp.CSharpCodeProvider();
var compParams = new System.CodeDom.Compiler.CompilerParameters();
compParams.GenerateInMemory   = true;
compParams.ReferencedAssemblies.Add("System.dll");
compParams.ReferencedAssemblies.Add("System.Net.dll");
compParams.ReferencedAssemblies.Add("System.Core.dll");
// Путь к ZennoPoster DLL — обычно здесь:
compParams.ReferencedAssemblies.Add(@"C:\Program Files\ZennoLab\RU\ZennoPoster Pro V7\7.8.15.0\Progs\ZennoLab.InterfacesLibrary.dll");

var result = provider.CompileAssemblyFromSource(compParams, sourceCode);

if (result.Errors.HasErrors)
{
    string errors = "";
    foreach (System.CodeDom.Compiler.CompilerError e in result.Errors)
        errors += "Строка " + e.Line + ": " + e.ErrorText + "\n";
    System.IO.File.AppendAllText(
        @"C:\AI Code Sherlock\zp_scripts\signal_handler.log",
        "[" + DateTime.Now + "] COMPILE ERROR:\n" + errors,
        System.Text.Encoding.UTF8
    );
    throw new Exception("compile_error: " + errors);
}

// Запускаем нужный метод
var assembly = result.CompiledAssembly;
var type     = assembly.GetType("SignalHandler");
var method   = type.GetMethod(methodName);
method.Invoke(null, new object[] { project });
 
  • Оценить
Реакции: BAZAg
Ясно, значит код в переменной нельзя хранить.
 
Спасибо за ссылку. Идея интересная у автора, но сам принцип напиши 2000 строк кода в кубике и потом пытайся найти ошибки с помощью ИИ - не очень)
Анализ ошибок через AI, в данном конкретном случае - второстепенное.
Пример кода о том, как вообще с любого текста скомпилировать код и вызвать желаемый метод и получить результат.
Вы верно привели нужный фрагмент кода.

На счёт анализа ошибок через AI - то идея также вполне рабочая.
У меня ещё руки не дошли до того, чтобы держать под рукой рабочий вариант.
Но, код у меня сейчас собирается из множества файлов в один, после чего приходится вручную запускать шаблон и смотреть в лог что там за ошибка, чтобы пойти её подправить и потом снова закрыть/открыть шаблон - короче говоря однотипные действия чтобы найти где пропустил точку с запятой или какие-то подобные ошибки из-за которых код не компилируется.
Так что, когда свободное время будет - однозначно буду собирать себе какое-то подобное решение, чтобы после сборки кода все же проверялось на компиляцию, тогда не придется переоткрывать шаблон если он заведомо в нерабочем состоянии.
Правда, к этой теме это мало имеет отношения...


Ясно, значит код в переменной нельзя хранить.
Можно, почему нельзя?
Просто это принесет Вам определенные сложности, к которым Вы скорее всего не готовы.
Код нужно держать в Общем Коде или там же привязывать его к файлу, который править, а он будет автоматически подтягиваться после перезапуска шаблона в PM.

Вроде JS код запускается таким способом с переменной.
 
  • Оценить
Реакции: AntonBust
Код нужно держать в Общем Коде или там же привязывать его к файлу
Поясните, не совсем понял. Допустим код сишарп хранится в файле txt , верно? Как его тогда запустить кубиком. Сейчас пробую. ошибка всего проекта, не запускает в случае когда кубик сишарп указывает только переменную.

То есть
Проект старт
Файл - привязать к .txt
в txt код сишарп
запустить кубик сишарп где переменная в которой хранится код - не запускает.

Я тогда совсем не понимаю зачем применение переменных в кубике сишарп предусмотрено.
 
Поясните, не совсем понял. Допустим код сишарп хранится в файле txt , верно? Как его тогда запустить кубиком. Сейчас пробую. ошибка всего проекта, не запускает в случае когда кубик сишарп указывает только переменную.

То есть
Проект старт
Файл - привязать к .txt
в txt код сишарп
запустить кубик сишарп где переменная в которой хранится код - не запускает.

Я тогда совсем не понимаю зачем применение переменных в кубике сишарп предусмотрено.
Так работать не будет.
В текстовом файле может храниться Общий Код.
Он естественно должен быть правильно оформлен (прописаны using, создан namespace, внутри которого должен быть class).
И уже в классе создаются необходимые методы.
А в кубике вызывается что-то типа CommonCode.Start(); если не возвращает значение или return CommonCode.Start(); если возвращает значение.
Здесь CommonCode - класс, Start - в одном случае метод void, в другом например возвращает string.

Но... Это пока никак не подразумевает использовать C# с переменной - это базовый способ вызывать свой код.
А текстовый файл нужен только для того, чтобы можно было изменять его за пределами PM.
Хотя, для начала наверно правильнее изменять код вручную в PM, чтобы разобраться с тем как это работает.

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

Что же касается вопроса зачем применение переменных в кубике сишарп предусмотрено - то всё очень просто - чтобы иметь возможность пробросить значения с локальных переменных в код и уже внутри кода как-то обработать эти данные, после чего вернуть результат.

Например в локальной переменной хранится какой-то html. А нам нужно например вытащить с помощью xpath или регулярками какие-то данные. Тогда мы просто делаем что-то вроде string html = project.Variables["html"].Value; и после этого делаем с текстом который хранится в html всё что хотим, например заменяем все цифры 1 на 0 как-то так html = html.Replace("1", "0");
А в конце, возвращаем результат обратно уже обработанный текст в ту же переменную или в новую, типа так:
project.Variables["html"].Value = html;

Это удобно так как бывает хочется обработать сразу много переменных, сделать много каких-то манипуляций - и тогда придется складывать много кубиков - а так, все это можно определить в одном кубике.
Например часто можно просто взять типа так:
project.Variables["html"].Value = "1";
project.Variables["html1"].Value = "2";
project.Variables["html2"].Value = "3";
project.Variables["html3"].Value = "4";
Тоесть, в одном кубике сразу в много переменных устанавливается значения.

Попытался объяснить...
Но, думаю если начать использовать и консультироваться с AI - то понимание само собой придет - быстро запоминается.
 
В текстовом файле может храниться Общий Код.
Я нашел в Projext maker конечно общий код, там все ясно как сохранить, а как вынести Общий код в отдельный файл и чтобы все запускалось в ЗП по расписанию?
 
Я нашел в Projext maker конечно общий код, там все ясно как сохранить, а как вынести Общий код в отдельный файл и чтобы все запускалось в ЗП по расписанию?
Напишите здесь в теме код, который Вы хотите запускать.
И что именно имеете ввиду под расписанием - код с файла применяется при открытии шаблона в PM, тоесть, может быть что не сработает если будет работать в ZP шаблон на расписании (тоесть изменение файла между запусками) - тут уже поддержку спрашивать отслеживает ли ZP изменение файла привязанного к общему коду между выполнениями.
 
Напишите здесь в теме код, который Вы хотите запускать.
По линии предполагается несколько кодов, 10-15 разных которые я хотел применять к задачам. В сишарп удобно и практично. Расписание под линию разных задач и коды могут изменяться, включать в себя другие детали.
Ясно, спасибо за подробное объяснение, не думал что это не до такой степени тяжело. Тяжелое придется обходить.
 
В текстовом файле может храниться Общий Код.
Он естественно должен быть правильно оформлен (прописаны using, создан namespace, внутри которого должен быть class).
И уже в классе создаются необходимые методы.
А в кубике вызывается что-то типа CommonCode.Start(); если не возвращает значение или return CommonCode.Start(); если возвращает значение.
Ну вот это похоже то что надо для выполнения. А есть какой-то пример? Я не знаю, спросил у администрации но там похоже не быстрое дело.
 
Ну вот это похоже то что надо для выполнения. А есть какой-то пример? Я не знаю, спросил у администрации но там похоже не быстрое дело.
C#:
Развернуть Свернуть Копировать
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary;
using ZennoLab.InterfacesLibrary.ProjectModel;
using ZennoLab.InterfacesLibrary.ProjectModel.Collections;
using ZennoLab.InterfacesLibrary.ProjectModel.Enums;
using ZennoLab.Macros;
using Global.ZennoExtensions;
using ZennoLab.Emulation;
using ZennoLab.CommandCenter.TouchEvents;
using ZennoLab.CommandCenter.FullEmulation;
using ZennoLab.InterfacesLibrary.Enums;

namespace ZennoLab.OwnCode
{
    /// <summary>
    /// A simple class of the common code
    /// </summary>
    public class CommonCode{
       
        public static void Start1(){
            // какой-то код - не возвращает значение
        }
        public static string Start2(){
            return "какой-то текст"; // возвращает строку
        }
       
        public static string Start3(IZennoPosterProjectModel project){
            project.SendInfoToLog("Сообщение в лог",true);
            return "какой-то текст"; // возвращает строку
        }
    }
}

C#:
Развернуть Свернуть Копировать
CommonCode.Start1(); // не возвращает значение
string text = CommonCode.Start2(); // возвращает строку
project.SendInfoToLog(text,true);
CommonCode.Start3(project); // пример пробрасывания project в метод
 
  • Оценить
Реакции: Axel
Спасибо. Только обратив внимание, вот же есть загружать код из файла! Это то что обсуждалось тут?


2026-09-25_15-27-00.png
 
  • Оценить
Реакции: BAZAg

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)