Как реализовать строчную отладку кода в C#?

Добрый день!

У меня имеется код (c#), который я формирую динамически. К примеру, сформировался код следующего вида:
NetOffice.ExcelApi.Application excel = new NetOffice.ExcelApi.Application();
excel.Visible = true;
excel.Workbooks.Open(@"C:\mail.xml");
while (true)
{
     System.Threading.Thread.Sleep(5 * 1000);
     break;
}


Я запускаю этот код при помощи Microsoft.CodeAnalysis.CSharp.Scripting, в отдельном делегате и всё ОК.
Но теперь мне необходимо по-шагово отладить данный код. Т.е. фактически, я хочу остановиться в том месте, где мне необходимо и получить все значения локальных/глобальных переменных (классический debug).

Каким образом я могу реализовать такую логику?

Заранее, спасибо за ответы!
  • Вопрос задан
  • 313 просмотров
Пригласить эксперта
Ответы на вопрос 2
@cicatrix
было бы большой ошибкой думать
Кирилл Серов, это одна из причин, по которой не стоит без абсолютно крайней необходимости заниматься метапрограммированием. Собственно, выходов у вас особо нет, либо нагромождать тестовый стенд, который в момент перехода к исполнению вашего сгенерированного текста остановит программу, скинет ваш код в файл, вы его загрузите в отладчик, проинициализируете все переменные и объекты, и отладите.
Второе - раз уж вы интегрируетесь с экселем, рассмотрите VBA в качестве вашего скриптового языка.
Третье - файловый ввод-вывод и пошаговое логирование в момент исполнения вашего кода со всей интересующей вас информацией.
И повторюсь, рассмотрите возможность отказаться от генерации компилируемого кода, используйте хотя бы любой скриптовой язык (vbs, js, ps1, python, и т. д.).
Ответ написан
Комментировать
lam0x86
@lam0x86
На самом деле, ничего сложного. Надо просто указать скрипту генерировать DebugInformation и указать путь к временному файлу с исходным кодом (студия не умеет дебажить исходники с памяти).

Вот пример:

class Program
    {
        static void Main(string[] args)
        {
            string scriptFileName = Path.GetTempFileName() + ".cs";

            var scriptBody = GenerateScript(scriptFileName);

            var script = CSharpScript.Create(
                scriptBody,
                globalsType: typeof(Globals),
                options: ScriptOptions
                         .Default
                         .WithEmitDebugInformation(true)
                         .WithFilePath(scriptFileName)
                         .WithFileEncoding(Encoding.UTF8));

            var sum = script.RunAsync(new Globals {X = 56, Y = 42}).Result.ReturnValue;

            Console.Out.WriteLine(sum);
            Console.ReadKey();

            File.Delete(scriptFileName);
        }

        private static string GenerateScript(string fileName)
        {
            var body = 
@"var result = X + Y;
return result;
";

            File.WriteAllText(fileName, body, Encoding.UTF8);

            return body;
        }
    }

    public class Globals
    {
        public int X { get; set; }

        public int Y { get; set; }
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы