Как мне написать расширяемый пользователем код? [Дубликат]

Как программист на Perl, я могу оценивать строки как код. Если бы я хотел, могу ли я сделать то же самое в C # (со строками или другим объектом, содержащим пользовательский ввод)?

Я хочу создать объект, в котором его методы могут быть предопределены в моем исходном коде или могут быть определены пользователем во время выполнения путем ввода строки, представляющей код C # для метода или запроса SQL. Вызов метода должен всегда возвращать свое скалярное значение в виде строки, я считаю, что было бы желательно сделать доступными некоторые предварительно определенные «системные» переменные для использования в вызове метода и некоторый код «Очистка» для проверки того, что строка действительно возвращена ,

Псуедо - Структура

 Object Statistic
      string  Name;
      functionref Method;

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

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

Любые идеи о том, где начать читать, чтобы достичь этого в C #?

Целью этой возможности является программа, которая отображает статистику для работающей системы / базы данных. Отслеживаемые значения не обязательно известны во время разработки, и как определить значение, требуемое для извлечения. Я хочу позволить Пользователю определять любые статистические данные, помимо того, что я предварительно кодирую систему.

17.03.2009 15:48:45
2 ОТВЕТА

Проверьте этот предыдущий вопрос .

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

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

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

1
23.05.2017 12:19:32

Я повторю сказанное Понтусом, особенно в отношении стабильности, затрат на поддержку и ожиданий, что пользователи будут писать код. Я также добавлю производительность в список, поскольку эти пользователи, вероятно, не будут знать о влиянии их кода на производительность. По этим и другим причинам evalконструкции, схожие с пользовательскими, не считаются разумными в C # и, вероятно, также не должны быть в perl .

Вместо этого, посмотрите на System.AddInпространство имен в .Net для обеспечения функциональности плагина для вашего приложения.

1
17.03.2009 16:08:15