У меня есть приложение С#, над которым я работаю, он загружает его код удаленно, а затем запускает его (ради аргумента можно предположить, что приложение защищено).
Код С#, но он отправляется как XML-документ, анализируется как строка, а затем скомпилируется и выполняется.
Теперь, что я хотел бы сделать - и у меня есть немного больше трудностей, чем я ожидал, - это возможность проанализировать весь документ и перед компиляцией вставить дополнительные команды после каждого выполнения строки.
Например, рассмотрим код:
using System;
using System.Collections.Generic;
using System.Linq;
namespace MyCode
{
static class MyProg
{
static void Run()
{
int i = 0;
i++;
Log(i);
}
}
}
Что бы я хотел, после разбора больше похоже:
using System;
using System.Collections.Generic;
using System.Linq;
namespace MyCode
{
static class MyProg
{
static void Run()
{
int i = 0;
MyAdditionalMethod();
i++;
MyAdditionalMethod();
Log(i);
MyAdditionalMethod();
}
}
}
Имейте в виду очевидные ловушки - я не могу просто иметь его после каждой полуколонии, потому что это не сработает в getter/setter, то есть:
Преобразование:
public string MyString { get; set; }
To:
public string MyString { get; MyAdditionalMethod(); set; MyAdditionalMethod(); }
не удастся. Как и объявления уровня класса, использование операторов и т.д. Кроме того, существует ряд случаев, когда я мог бы добавить в MyAdditionalMethod() после фигурных скобок - как в делегатах, сразу после операторов if или объявлений методов и т.д.
Итак, что я изучал в CodeDOM, и похоже, что это может быть решение, но сложно выяснить, с чего начать. Я в противном случае пытаюсь разобрать всю вещь и создать дерево, которое я могу проанализировать, хотя это немного сложно, учитывая количество случаев, которые мне нужно рассмотреть.
Кто-нибудь знает какие-либо другие решения, которые там есть?