Я делаю Генетическую Программу, но я поражаю ограничение C#, где я хочу представить новые функции алгоритму, но я не могу сделать этого, не перекомпилировав программу. В сущности я хочу, чтобы пользователь программы обеспечил позволенные функции, и GP будет автоматически использовать их. Было бы замечательно, если пользователь обязан знать как можно меньше о программировании.
Я хочу включить новые функции, не компилируя их в программу. В Python это легко, так как он все интерпретируется, но у меня нет подсказки, как сделать это с C#. Кто-либо знает, как достигнуть этого в C#? Есть ли какие-либо библиотеки, методы, и т.д.?
Это зависит от того, как вы хотите, чтобы пользователь программы " предоставить разрешенные функции »
Размещение DLR (а также IronPython или IronRuby) может быть здесь хорошим выбором, потому что вы получаете хорошо протестированную среду и все оптимизации, предоставляемые DLR. Вот инструкция по использованию IronPython.
Добавлено в ответ на ваш вопрос о производительности: DLR достаточно умен в оптимизации. Он не заново интерпретирует исходный код вслепую каждый раз: как только он преобразовал исходный код (или, в частности, заданную функцию или класс) в MSIL, он будет повторно использовать это скомпилированное представление до тех пор, пока исходный код не изменится (например, функция переопределяется). Так что, если пользователь продолжает использовать одну и ту же функцию, но с разными наборами данных, то, пока вы можете использовать один и тот же ScriptScope, вы должны получить приличную производительность; то же самое, если вас беспокоит только то, что вы собираетесь запускать одну и ту же функцию миллионы раз во время генетического алгоритма. Хостинг DLR довольно прост, поэтому не составит труда проверить концепцию и измерить, соответствует ли она вашим потребностям.
Вы можете взглянуть на System.Reflection.Emit, чтобы сгенерировать код на уровне IL.
Или сгенерируйте C #, скомпилируйте в библиотеку и загрузите ее динамически. Не так гибко.
У вас есть доступ к компилятору из кода, затем вы можете создавать экземпляры скомпилированного кода и использовать их без перезапуска приложения. Примеры этого есть около
и
Второй - это вычислитель javascript, но его можно достаточно легко адаптировать.
На самом деле генерировать IL очень просто. См. Это руководство: http://www.meta-alternative.net/calc.pdf
Вы можете попробовать создать Деревья выражений и управлять ими. Используйте Linq для оценки деревьев выражений.
Вы также можете использовать CodeDom для компиляции и запуска функции. Конечно, вы можете найти в Google несколько примеров, которые могут соответствовать вашим потребностям. Похоже, что эта статья "Как для динамической компиляции кода C # » и эта статья« Динамическое выполнение кода в .Net » может вам помочь.