Подтвердить что ты не робот

Как отлаживать/прерывать скомпилированный код

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

Есть ли способ получить кодовое представление для создания 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);
4b9b3361

Ответ 1

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

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

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

Ответ 2

Ответ by @bbmud верен, хотя он пропускает одно исправление ошибки. CSharpCodeGenerator (класс в .NET компилирует код С# в 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 как все временные файлы, которые по умолчанию означает их удаление.