Действительно ли возможно скомпилировать и выполнить новый код во времени выполнения в.NET?

33
задан raven 20 July 2013 в 15:41
поделиться

12 ответов

Я не знаю, возможно ли реализовать Ваш ConvertEquationToCode функция, однако, можно генерировать структуру данных, которая представляет вычисление, которое необходимо выполнить.

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

Это имеет некоторые преимущества. Например, если Вы делаете то, что - если анализ и хотят изменить значение одного входа за один раз, можно повторно вычислить результаты, которые зависят от значения, которое Вы изменили при сохранении результатов, которые не делают.

-2
ответ дан 27 November 2019 в 18:25
поделиться

Если все остальное перестало работать, под Системой существуют классы. Отражение. Испустите пространство имен, которое можно использовать для создания новых блоков, классов и методов.

0
ответ дан 27 November 2019 в 18:25
поделиться

Я сделал бы рекурсивную функцию, которая не пишет код, но вместо этого применяет основные операторы к частям строки на основе специальных символов, найденных в той строке. Если больше чем один специальный символ найден, он разбивает строку и называет себя на тех двух частях.

-1
ответ дан 27 November 2019 в 18:25
поделиться

Вы могли запустить здесь и если Вы действительно хотите войти в него, , Шиканье может быть изменено для удовлетворения потребностей. Вы могли также интегрироваться LUA с.NET . Любые три из них могли быть использованы в теле делегата к Вашему ConvertEquationToCode.

2
ответ дан 27 November 2019 в 18:25
поделиться

Я сделал это использование CSharpCodeProvider путем создания шаблонного класса и функционального материала как строка константы в моем классе генератора. Затем я ввожу пользовательский код в шаблон и компиляцию.

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

, Если бы безопасность является во всем беспокойством, я рекомендовал бы использовать Деревья Лямбда-выражения, но в противном случае использовать CSharpCodeProvider - довольно устойчивая опция.

3
ответ дан 27 November 2019 в 18:25
поделиться

Можно попытаться смотреть или на Деревья CodeDom или Лямбда-выражения. Я думаю, что любой из тех должен позволить Вам выполнять это. Деревья выражений являются, вероятно, лучшим способом пойти, но также и иметь кривую высшего образования.

3
ответ дан 27 November 2019 в 18:25
поделиться

Можно также создать Систему. Xml. XPath. XPathNavigator от пустого, "фиктивного" потока XML, и оценивают выражения с помощью средства анализа XPath:

static object Evaluate ( string xp )
{
  return _nav.Evaluate ( xp );
}
static readonly System.Xml.XPath.XPathNavigator _nav
  = new System.Xml.XPath.XPathDocument (
      new StringReader ( "<r/>" ) ).CreateNavigator ( );

, Если Вы хотите к регистровым переменным использовать в рамках этого выражения, можно динамично создать XML, который можно передать в Оценить перегрузке, которая берет XPathNodeIterator.

<context>
  <x>2.151</x>
  <y>231.2</y>
</context>

можно затем записать, что выражения как "x / 2 * 0.07914" и затем x являются значением узла в контексте XML. Другая хорошая вещь, у Вас будет доступ ко всем функциям ядра XPath, который включает математику и методы обработки строк и больше материала.

, Если Вы хотите взять его далее, можно даже создать собственный XsltCustomContext (или плохо отправить здесь по требованию), где можно разрешить ссылки на дополнительные функции и переменные:

object result = Evaluate ( "my:func(234) * $myvar" );

my:func отображается на методе C#/.NET, который берет двойное или международное как параметр. myvar регистрируется как переменная в контексте XSLT.

5
ответ дан 27 November 2019 в 18:25
поделиться

Да, определенно возможный сделать, чтобы пользователь ввел C# в текстовое поле, затем скомпилируйте тот код и выполните его из Вашего приложения. Мы делаем это на моей работе для обеспечения пользовательской бизнес-логики.

Вот статья (я больше, чем не просмотрел ее), который должен запустить Вас:

http://www.c-sharpcorner.com/UploadFile/ChrisBlake/RunTimeCompiler12052005045037AM/RunTimeCompiler.aspx

7
ответ дан 27 November 2019 в 18:25
поделиться

Вы могли бы попробовать это: Калькулятор. Сеть

Это оценит математическое выражение.

От регистрации его будет поддерживать следующее:

MathEvaluator eval = new MathEvaluator();
//basic math
double result = eval.Evaluate("(2 + 1) * (1 + 2)");
//calling a function
result = eval.Evaluate("sqrt(4)");
//evaluate trigonometric 
result = eval.Evaluate("cos(pi * 45 / 180.0)");
//convert inches to feet
result = eval.Evaluate("12 [in->ft]");
//use variable
result = eval.Evaluate("answer * 10");
//add variable
eval.Variables.Add("x", 10);            
result = eval.Evaluate("x * 10");

Страница Загрузки И распределяется в соответствии с лицензией BSD.

13
ответ дан 27 November 2019 в 18:25
поделиться

Попробуйте Vici.Parser: загрузите его здесь (бесплатно) , это самый гибкий анализатор / вычислитель выражений, который я нашел до сих пор.

1
ответ дан 27 November 2019 в 18:25
поделиться

Вы можете реализовать калькулятор стека постфиксов . В основном, что вам нужно сделать, это преобразовать выражение в постфиксную нотацию, а затем просто перебрать токены в вашем постфиксе для вычисления.

0
ответ дан 27 November 2019 в 18:25
поделиться

можно использовать system.CodeDom для генерации кода и компиляции его "на лету". посмотрите здесь

0
ответ дан 27 November 2019 в 18:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: