2016-12-16 4 views
-2

У меня есть C# программа, которая использует объекты из класса, который имеет метод ищет что-то вроде этого:Использование C#, чтобы позволить пользователям создавать собственные методы

public double TheMethod(double argument1, double argument2, ...,double argumentN) 
{ 
    //method body: do something with the arguments 
    //return the result 
} 

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

Мне кажется, что сценарий может быть способом, но у меня возникли проблемы с попыткой начать работу. Каков наилучший способ подойти к этой ситуации?

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

+0

Есть много вопросов и статей по теме - https://www.bing.com/search?q=c%23+scripting (или любая другая поисковая система, которая вам нравится Yahoo, Yandex, ... as предположительно, Google было недостаточно). «проблема с попыткой запустить {scripting}» - очень плохое объяснение проблемы, с которой вы сталкиваетесь при реализации одного из многих предложений, - если у вас есть определенная проблема при настройке сценариев, лучше спросить об этом. –

ответ

1

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

В течение времени выполнения можно заменить живое тело метода, но это не для легкого сердца! https://msdn.microsoft.com/en-us/library/system.reflection.emit.aspx

Если вы счастливы, чтобы сделать работу, чтобы создать свой собственный язык сценариев мини, посмотрите на Antlr http://www.antlr.org/

+0

Reflection.Emit - совершенно другая история и будет полезен для создания компилятора ... –

+0

@AlexeiLevenkov Зачем объяснять ваше заявление? Следуя его ссылке, документация гласит: «Основными клиентами этих классов являются ** скриптовые движки ** и компиляторы». Это неверно? – Skyqula

1

Вы можете, конечно, динамически компилировать и выполнять C#. См. Is it possible to dynamically compile and execute C# code fragments?

В зависимости от того, кто ваши пользователи и как их сценарий должен интегрироваться в более широкое приложение, IronPython может быть более приятным вариантом - по существу, скриптом в python. См. https://blogs.msdn.microsoft.com/charlie/2009/10/25/running-ironpython-scripts-from-a-c-4-0-program/ для получения дополнительной информации об интеграции C# и IronPython.

Как всегда при запуске любого динамически вводимого кода из внешнего источника, подумайте о безопасности.

+0

Предложение IronPython выглядит многообещающим. Вы знаете, как это повлияет на скорость? Например, если я напишу ту же логику тела метода в IronPython, как в исходном коде, будет ли реализация IronPython значительно медленнее? – user57029

+0

С любым динамически скомпилированным кодом вы будете нести дополнительное время, когда код будет скомпилирован, как для C#, так и для IronPython. http://stackoverflow.com/questions/3081661/speed-of-code-execution-ironpython-vs-c указывает, что IronPython работает медленнее, но, вероятно, это зависит от ситуации. Сколько кода вводит ваш пользователь? Если время выполнения составляет 5 секунд в C# и 7 сек в IronPython, имеет ли значение 2sec значение? Без контекста трудно сказать. – user783836

Смежные вопросы

 Смежные вопросы