У меня есть приложение C #, над которым я работаю, которое загружает его удаленно, а затем запускает его (в качестве аргумента вы можете предположим, что приложение защищено).
Код - C #, но он отправляется в виде 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();
}
}
}
Имейте в виду очевидные подводные камни - я не могу использовать его только после каждой точки с запятой, потому что это не будет работать в геттере / сеттере, например:
Преобразование:
public string MyString { get; set; }
To:
public string MyString { get; MyAdditionalMethod(); set; MyAdditionalMethod(); }
не удастся. Как и объявления уровня класса, операторы using и т. Д. Кроме того, есть ряд случаев, когда я мог бы добавить в MyAdditionalMethod () после фигурных скобок - например, в делегатах, сразу после операторов if или объявлений методов и т.д.
Итак, то, что я изучал в CodeDOM, и похоже, что это могло бы быть решением, но трудно понять, с чего начать. В противном случае я пытаюсь разобрать все и создать дерево, которое я могу проанализировать - хотя это немного сложно, учитывая количество случаев, которые мне нужно рассмотреть.
Кто-нибудь знает какие-либо другие решения, которые существуют?