Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/47: Рейтинг темы: голосов - 47, средняя оценка - 4.62
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347

Выполнить код из строки

25.06.2019, 16:59. Показов 9055. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, у меня есть приложения, которое соедено с интернетом, могу я, получив из интернета строку, примерно такого типа:
string s = "may"; Console.WriteLine(may);
т.е. выполнить этот код не из кода самого приложения, а полученого из строки?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.06.2019, 16:59
Ответы с готовыми решениями:

Выполнить простенький код c# из строки
Смысл в том что в одном месте в программе уравнение должен вводить пользователь. Пример в статике: double testF(double x) { ...

Внутри программы на C# выполнить JS код и передать результаты в основной код C#
Добрый день. Требуется внутри программы на C# выполнить JS код и передать результаты в основной код C# , где с ними будут производиться...

Выполнить код из строки
У меня на форме есть несколько textBox и richTextBox, пользователь вносит значения в textBox, а затем пишет в richBox что-то типа...

7
 Аватар для Kazbek17
1484 / 939 / 454
Регистрация: 06.02.2012
Сообщений: 2,868
25.06.2019, 17:46
k0vpack, Можно, читаем информацию как выполнять компиляцию на лету.
Выполнение C# кода "на лету"
2
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347
25.06.2019, 18:09  [ТС]
Kazbek17, да, но этот код у меня не работает:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;
 
    //Определения делегата для организации вывода результатов выполнения частей кода 
    public delegate void ExecuteLogHandler(object message);
 
public class CharpExecuter
{
    //Код готовый к выполнению
    string formatedProgramText;
 
    public string LastProgramText
    {
        get { return formatedProgramText; }
    }
    //Поле делегата объявлено статическим для того, чтобы можно было
    //вызывать из программы, которая будет компилироваться
    public static ExecuteLogHandler OnExecute;
    //Список сборок, которые будут подключатся при компиляции
    private List<string> refferences = new List<string>();
 
    public List<string> Refferences
    {
        get { return refferences; }
        set { refferences = value; }
    }
    //Список using определений, которые будут добавлены начало кода
    private List<string> usings = new List<string>();
 
    public List<string> Usings
    {
        get { return usings; }
        set { usings = value; }
    }
    //Предопределенные части программы. Добавляется публичный статический
    //метод ScriptMethod, который будет вызываться из основного приложения
    //внутри используется Stopwatch для вычисления времени выполнения программы
    //Также объявлен метод Log, который вызывает OnExecute во внешней сборке (см. ниже)
    readonly string header = @"
        namespace CScript
        {
            public class Script
            {
                public static void ScriptMethod()
                {
                    Stopwatch sw = new Stopwatch();
                    sw.Start();  
        ";
 
    readonly string footer = @" sw.Stop();Log(sw.Elapsed.ToString());
                }
                static void Log(object message)
                {
                    if(CharpShell.CharpExecuter.OnExecute != null)
                        CharpShell.CharpExecuter.OnExecute(message);
                }
            }
        }";
 
    public CharpExecuter(ExecuteLogHandler onExecute)
    {
        OnExecute += onExecute;
        //Инициализация сборок, которые будут добавлены по умолчанию
        refferences.AddRange(new string[]
                {
                "System.dll",
                "System.Core.dll",
                "System.Net.dll",
                "System.Data.dll",
                "System.Drawing.dll",
                "System.Windows.Forms.dll",
                //Необходимо добавить свою сборку, чтобы можно было вызывать OnExecute
                Assembly.GetAssembly(typeof(CharpExecuter)).Location,
 
                });
        //Инициализация using которые будут добавлены по умолчанию
        usings.AddRange(new string[]
            {
                "System",
                "System.IO",
                "System.Net",
                "System.Threading",
                "System.Collections.Generic",
                "System.Text",
                "System.Text.RegularExpressions",
                "System.ComponentModel",
                "System.Data",
                "System.Drawing",
                "System.Diagnostics",
                "System.Linq",
                "System.Windows.Forms"
            });
    }
    //Выполнение кода
    public void Execute(List<string> code)
    {
        //Форматирование сырого кода (добавление предопределенный частей)
        FormatSources(code);
        //Выполнение
        Execute();
    }
 
    public void Execute()
    {
        Execute(formatedProgramText);
    }
 
    public void Execute(string program)
    {
        //Создание класса CSHarpProvider с указанием того, что сборка генерируется в памяти
        var CSHarpProvider = CSharpCodeProvider.CreateProvider("CSharp");
        CompilerParameters compilerParams = new CompilerParameters()
        {
            GenerateExecutable = false,
            GenerateInMemory = true,
        };
        //Добавление сборок для компиляции
        compilerParams.ReferencedAssemblies.AddRange(refferences.ToArray());
        //Компиляция
        var compilerResult = CSHarpProvider.CompileAssemblyFromSource(compilerParams, program);
        if (compilerResult.Errors.Count == 0)
        {
            OnExecute(string.Concat("Executing...", Environment.NewLine));
            try
            {
                //Вызов метода ScriptMethod в сборке которая скомпилировалась
                compilerResult.CompiledAssembly.GetType("CScript.Script").GetMethod("ScriptMethod").Invoke(null, null);
                OnExecute(string.Empty);
                OnExecute("Done.");
            }
            catch (Exception e)
            {
                OnExecute(e.InnerException.Message + "rn" + e.InnerException.StackTrace);
            }
        }
        else
        {
            foreach (var oline in compilerResult.Output)
                OnExecute(oline);
        }
    }
    //Форматирование кода (добавление предопределенных частей)
    public string FormatSources(string text)
    {
        string usings = FormatUsings();
        formatedProgramText = string.Concat(usings, header, text, footer);
        return formatedProgramText;
    }
 
    public string FormatSources(List<string> code)
    {
        StringBuilder sb = new StringBuilder(header);
        foreach (var sc in code)
        {
            sb.AppendLine(sc);
        }
        sb.AppendLine(footer);
        formatedProgramText = sb.ToString();
        return formatedProgramText;
    }
    //Форматирование определений using
    private string FormatUsings()
    {
        StringBuilder sb = new StringBuilder();
        foreach (string using_str in usings)
            sb.AppendFormat("using {0};{1}", using_str, Environment.NewLine);
        return sb.ToString();
    }
}
 
public class Program
{
    static void Main()
    {
        string s = "for(int i = 0; i < 10; i++) Console.WriteLine(i);";
        CharpExecuter cs = new CharpExecuter(new ExecuteLogHandler((o) => Console.WriteLine(o)));
        cs.FormatSources(s);
        cs.Execute();
        Console.ReadKey();
    }
}
На выходе вот такая ошибка, точнее это не ошибка, в результат выполнения т.е. Console.WriteLine(o);
Кликните здесь для просмотра всего текста
Microsoft (R) Visual C# Compiler version 4.7.3056.0

for C# 5
Copyright (C) Microsoft Corporation. All rights reserved.



This compiler is provided as part of the Microsoft (R) .NET Framework, but only supports language versions up to C# 5, which is no longer the latest version. For compilers that support newer versions of the C# programming language, see http://go.microsoft.com/fwlink/?LinkID=533240

c:\Users\k0vpack\AppData\Local\Temp\hx3o z4vz.0.cs(27,24): error CS0103: The name 'CharpShell' does not exist in the current context
c:\Users\k0vpack\AppData\Local\Temp\hx3o z4vz.0.cs(28,25): error CS0103: The name 'CharpShell' does not exist in the current context
Хотя в настройках проекта менял разные версии, ставил 8, 7, 5, 4, на никаких не работает.
0
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
25.06.2019, 18:32
k0vpack, так ты зачем простанство имен убрал? Оно у тебя вызывается по нему, либо добавь обратно, либо же
C#
1
compilerResult.CompiledAssembly.GetType("CScript.Script").GetMethod("ScriptMethod").Invoke(null, null);
замени на
C#
1
compilerResult.CompiledAssembly.GetType("Script").GetMethod("ScriptMethod").Invoke(null, null);
1
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347
25.06.2019, 18:40  [ТС]
kitsoRik, а можно ли как-то получить возвращаемое значения?
0
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
25.06.2019, 18:45
k0vpack, да, присвой значения строки которую я тебе говорил изменить, и вернется тебе object который ты сможешь преобразовать в свой класс.
0
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347
26.06.2019, 14:49  [ТС]
Kazbek17, а возможно ли как-то с аргуменатами ref/out?
0
 Аватар для Kazbek17
1484 / 939 / 454
Регистрация: 06.02.2012
Сообщений: 2,868
26.06.2019, 15:15
k0vpack, Описывайте свою реализацию и вызывайте что хотите.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.06.2019, 15:15
Помогаю со студенческими работами здесь

Как выполнить код из строки?
Есть массив строк в json в них строка мат формулы типа (tan($x)+sin($p2))*$p1. Как выполнить это строку? Еще если не тяжело подскажите как...

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

При нажатии на button выполнить свой код + код другого баттона
Как?

Ввести две символьных строки. Выполнить поиск второй строки в первой и вывести номер позиции первой строки, с которой вторая строка содер-жится в ней
Ввести две символьных строки. Выполнить поиск второй строки в первой и вывести номер позиции первой строки, с которой вторая строка...

Строки. Множества. Выполнить перевод символов строки из верхнего регистра в нижний и наоборот
ПОРЯДОК ВЫПОЛНЕНИЯ 1. Ввести множество, запись или строку с помощью клавиатуры. 2. Вывести на экран монитора исходную запись,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru