2009-05-17 5 views
19

У меня есть приложение, которое динамически загружает исходные файлы 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); 
+0

Из любопытства (я никогда не испортил вещи CodeDom), что произойдет, если вы попытаетесь поместить System.Diagnostics.Debugger.Break(); где-то в вашем коде? Можете ли вы тогда войти в нее? – BFree

+0

это сработало, но только с вариантами в принятом ответе. –

+0

Я продублировал этот вопрос за недоразумение (кододом не был тем ключом, который я искал). http://stackoverflow.com/questions/1593920/debugging-a-generated-net-assembly-from-within-the-application-that-generated-it/1594910#1594910. Я добавил решение с интерфейсом. Надеюсь, это поможет ... – jdehaan

ответ

31

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

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

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

+2

Это 2.42 года спустя, но вы, сэр, УДИВИТЕЛЬНЫ! – Philip

+0

Это спасло мое время, чтобы узнать проблему :) – superachu

7

answer by @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 файлы. Опция elseresults.TempFiles.AddExtension(fileExtension); сообщает, что она обрабатывает pdb как все временные файлы, которые по умолчанию означает их удаление.

+0

Второй аргумент в 'TempFileCollection' (с именем« keepFiles ») уже устанавливает для свойства' KeepFiles' значение true. (или, по крайней мере, в .NET 4.0) –

Смежные вопросы