Компиляция и запуск кода C # программно

2

У меня есть приложение С#, и я хочу запустить функцию, которая определена в тексте, чтобы взять один параметр класса A и вернуть double.

Параметром "A" будут некоторые структурированные данные, а функция будет формулой на A.

(Представьте, что A имеет свойства num1, num2 и одна формула, чтобы вернуть среднее значение, другое произвольно для возврата num1 * 2).

Таким образом, я хочу загрузить свое определение функции из текстового источника, скомпилировать их каким-то образом и выполнить их.

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

Каким образом это можно сделать?

  • 0
    Я думаю, вам нужно указать, какую версию C # вы используете. Новые версии могут сделать это легче, чем старые.
  • 0
    старая версия .NET 1.1 к сожалению.
Теги:

5 ответов

3
Лучший ответ

Используйте .Net CodeDOM для компиляции С# на лету

  • 0
    CodeDom отлично подходит для такого рода проблем. Однако, если вам нужно использовать более продвинутые функции C #, которые CodeDom не поддерживает, вам следует рассмотреть возможность использования Reflection.Emit.
  • 0
    Ссылка не работает ...
1

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

0

Другой подход к этому - использовать класс DynamicMethod. Хотя для этого требуется знание IL, чтобы сделать это.

Я бы предположил, что это было бы быстрее, если бы компилировать во время выполнения.

0

Возможно, вам стоит взглянуть на код С#. Вы можете использовать это для динамической записи и компиляции кода С#, а затем выполнить его.

Остерегайтесь, что это операция с очень высоким риском, поэтому будьте осторожны. Тем не менее его классная функциональность в среде.

0

Существует документация о том, как скомпилировать код С# здесь.

После того как вы его скомпилировали, вам понадобится использовать отражение для вызова метода (при условии его статического)

Если вы хотите вставить его в существующий класс с помощью LCG, вам нужно будет использовать IL.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню