Как отлаживать/прерывать скомпилированный код
У меня есть приложение, которое динамически загружает исходные файлы С# и запускает их как плагины. Когда я запускаю основное приложение в режиме отладки, можно ли отлаживать динамическую сборку? Очевидно, что установка контрольных точек является проблематичной, поскольку источник не является частью исходного проекта, но должен ли я иметь возможность входить или исключать исключения для кода?
Есть ли способ получить кодовое представление для создания 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);
Ответы
Ответ 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 как все временные файлы, которые по умолчанию означает их удаление.