Как говорится в вопросе, я застрял с .Net 2.0 здесь, в моей компании, и нет никаких шансов на обновление. Есть ли способ заставить Иронию работать в .NET 2.0.
Я кратко попытаюсь объяснить, чего я пытаюсь достичь. У нас в нашей компании есть система начисления заработной платы, где мы позволяем клиенту определять собственные формулы для пунктов платежных ведомостей. Эти формулы должны использовать некоторые ключевые слова / функции, которые мы проверяем через Regex (очень ненадежно). Затем мы создаем объект управления сценарием Microsoft и используем его функцию eval для анализа фрагмента. Эти фрагменты в свою очередь вызывают ключевые слова / функции, определенные в классе, чтобы получить вывод.
Но сказать, что у этой системы есть недостаток, очень вежливо. Иногда он просто переполняется с ошибкой.
Очень глупо, например. -
FVAL(A)/(FVAL(B)+FVAL(C))
Очевидно, что есть две стадии, через которые проходит эта формула.
Первый этап проверки, на котором мы делаем следующее -
Проверьте через регулярные выражения, есть ли какие-либо используемые ключевые слова, которых нет в предопределенном массиве. Список ключевых слов
Затем проверьте, используются ли какие-либо переменные (в данном случае - A, B, C), которых нет в массиве переменных.
Если все проверки пройдены, мы передаем строку формулы в функцию eval объекта ScriptControlClass, а также добавляем статический класс со всеми определенными в нем функциями (в данном случае рассмотрим FVAL()
), и эта функция возвращает логическое значение true
если переменная является допустимой для использования в этом контексте (например, добавление даты и числа вернет false)
Теперь, после вычисления этого выражения, получается результат - DivideByZeroException , почему, поскольку тип eval передает все логические значения true
в 1
и выполняет с ним нормальную арифметику.
FVAL(A)/(FVAL(B)+FVAL(C)) => 1/(1-1)
Второй этап почти аналогичен, но без какой-либо проверочной проверки, например, не возвращая true, мы фактически возвращаем значение переменной из DataTable
, который состоит из значений для каждой переменной.
Система устарела, и она серьезно действует мне на нервы, и мне действительно нужна помощь. Пожалуйста, предложите.