Как отлаживать / разбивать в скомпилированном коде - PullRequest
21 голосов
/ 18 мая 2009

У меня есть приложение, которое динамически загружает исходные файлы c # и запускает их как плагины. Когда я запускаю основное приложение в режиме отладки, возможно ли выполнить отладку в динамической сборке? Очевидно, что установка точек останова проблематична, поскольку исходный код не является частью исходного проекта, но должен ли я иметь возможность вмешиваться или нарушать исключения для кода?

Есть ли способ получить код для генерации PDB для этого или чего-то еще?

Вот код, который я использую для динамического компиляции.

CSharpCodeProvider codeProvider = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });
//codeProvider.
ICodeCompiler icc = codeProvider.CreateCompiler();

CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
parameters.GenerateInMemory = true;
parameters.CompilerOptions = string.Format("/lib:\"{0}\"", Application.StartupPath);
parameters.ReferencedAssemblies.Add("System.dll");
parameters.ReferencedAssemblies.Add("System.Core.dll");


CompilerResults results = icc.CompileAssemblyFromSource(parameters, Source);
DLL.CreateInstance(t.FullName, false, BindingFlags.Default, null, new object[] { engine }, null, null);

Ответы [ 2 ]

37 голосов
/ 18 мая 2009

Попробуйте следующие варианты:

parameters.GenerateInMemory = false; //default
parameters.TempFiles = new TempFileCollection(Environment.GetEnvironmentVariable("TEMP"), true);
parameters.IncludeDebugInformation = true;

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

10 голосов
/ 25 ноября 2009

Ответ от @ bbmud правильный, хотя он пропускает одно исправление ошибки. CSharpCodeGenerator (класс в .NET кода C # для компиляции в IL) настроен на удаление файлов pdb сразу после их создания, ЕСЛИ ВЫ не добавите /debug:pdbonly в строку CompilerOptions. Однако, если вы это сделаете, флаг IncludeDebugInformation игнорируется, и компилятор генерирует оптимизированный код, который трудно отладить. Чтобы избежать этого, вы должны явно указать генератору кода, чтобы он сохранял все файлы.

Вот полный рецепт:

parameters.GenerateInMemory = false; //default
parameters.TempFiles = new TempFileCollection(Environment.GetEnvironmentVariable("TEMP"), true);
parameters.IncludeDebugInformation = true;
parameters.TempFiles.KeepFiles = true

Вот часть преступника кода CSharpCodeGenerator:

  string fileExtension = "pdb";
    if ((options.CompilerOptions != null) && (CultureInfo.InvariantCulture.CompareInfo.IndexOf(options.CompilerOptions, "/debug:pdbonly", CompareOptions.IgnoreCase) != -1))
    {
        results.TempFiles.AddExtension(fileExtension, true);
    }
    else
    {
        results.TempFiles.AddExtension(fileExtension);
    }

TempFiles.AddExtension(fileExtension, true) говорит компилятору сохранить файлы pdb. Параметр else results.TempFiles.AddExtension(fileExtension); указывает, что pdb следует рассматривать как все временные файлы, что по умолчанию означает их удаление.

...