C#, как создать функции, которые интерпретируются во времени выполнения

Я делаю Генетическую Программу, но я поражаю ограничение C#, где я хочу представить новые функции алгоритму, но я не могу сделать этого, не перекомпилировав программу. В сущности я хочу, чтобы пользователь программы обеспечил позволенные функции, и GP будет автоматически использовать их. Было бы замечательно, если пользователь обязан знать как можно меньше о программировании.

Я хочу включить новые функции, не компилируя их в программу. В Python это легко, так как он все интерпретируется, но у меня нет подсказки, как сделать это с C#. Кто-либо знает, как достигнуть этого в C#? Есть ли какие-либо библиотеки, методы, и т.д.?

6
задан Jon Seigel 17 May 2010 в 04:20
поделиться

6 ответов

Это зависит от того, как вы хотите, чтобы пользователь программы " предоставить разрешенные функции »

  • . Если пользователь выбирает функции, которые вы уже реализовали, вы можете передать их как делегаты или деревья выражений.
  • Если пользователь собирается написать свои собственные методы на C # или другом языке .NET и скомпилировать их в сборку, вы можете загрузить их с помощью Reflection.
  • Если вы хотите, чтобы пользователь мог вводить исходный код C # в вашу программу, вы можете скомпилировать его с помощью CodeDom, а затем вызвать полученную сборку с помощью Reflection.
  • Если вы хотите предоставить пользователю собственный язык выражения, например простой математический язык, тогда (при условии, что вы можете разбирать язык) вы можете использовать Reflection.Emit, чтобы сгенерировать динамическую сборку и вызвать ее, используя - как вы уже догадались - Reflection. Или вы можете построить дерево выражений из пользовательского кода и скомпилировать его с помощью LINQ - в зависимости от того, какая гибкость вам нужна. (И если вы можете позволить себе подождать, деревья выражений в .NET 4.0 снимают многие ограничения, которые были в 3.5, так что вы можете вообще избежать Reflection.Emit.)
  • Если вы рады, что пользователь ввел выражений с использованием Python, Ruby или другого языка DLR, вы можете разместить среду выполнения динамического языка, которая будет интерпретировать код пользователя за вас.

Размещение DLR (а также IronPython или IronRuby) может быть здесь хорошим выбором, потому что вы получаете хорошо протестированную среду и все оптимизации, предоставляемые DLR. Вот инструкция по использованию IronPython.

Добавлено в ответ на ваш вопрос о производительности: DLR достаточно умен в оптимизации. Он не заново интерпретирует исходный код вслепую каждый раз: как только он преобразовал исходный код (или, в частности, заданную функцию или класс) в MSIL, он будет повторно использовать это скомпилированное представление до тех пор, пока исходный код не изменится (например, функция переопределяется). Так что, если пользователь продолжает использовать одну и ту же функцию, но с разными наборами данных, то, пока вы можете использовать один и тот же ScriptScope, вы должны получить приличную производительность; то же самое, если вас беспокоит только то, что вы собираетесь запускать одну и ту же функцию миллионы раз во время генетического алгоритма. Хостинг DLR довольно прост, поэтому не составит труда проверить концепцию и измерить, соответствует ли она вашим потребностям.

13
ответ дан 8 December 2019 в 04:29
поделиться

Вы можете взглянуть на System.Reflection.Emit, чтобы сгенерировать код на уровне IL.

Или сгенерируйте C #, скомпилируйте в библиотеку и загрузите ее динамически. Не так гибко.

1
ответ дан 8 December 2019 в 04:29
поделиться

У вас есть доступ к компилятору из кода, затем вы можете создавать экземпляры скомпилированного кода и использовать их без перезапуска приложения. Примеры этого есть около

Здесь

и

Здесь

Второй - это вычислитель javascript, но его можно достаточно легко адаптировать.

1
ответ дан 8 December 2019 в 04:29
поделиться

На самом деле генерировать IL очень просто. См. Это руководство: http://www.meta-alternative.net/calc.pdf

1
ответ дан 8 December 2019 в 04:29
поделиться

Вы можете попробовать создать Деревья выражений и управлять ими. Используйте Linq для оценки деревьев выражений.

7
ответ дан 8 December 2019 в 04:29
поделиться

Вы также можете использовать CodeDom для компиляции и запуска функции. Конечно, вы можете найти в Google несколько примеров, которые могут соответствовать вашим потребностям. Похоже, что эта статья "Как для динамической компиляции кода C # » и эта статья« Динамическое выполнение кода в .Net » может вам помочь.

2
ответ дан 8 December 2019 в 04:29
поделиться
Другие вопросы по тегам:

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