如何在编码的编译代码中调试/中断

我有一个应用程序动态加载c#源文件并将其作为插件运行。 当我在调试模式下运行主应用程序时,是否可以调试到动态程序集? 显然设置断点是有问题的,因为源不是原始项目的一部分,但是我应该能够进入或打破代码的exception吗?

有没有办法让编码器生成这个或什么的PDB?

这是我用于动态compliation的代码。

CSharpCodeProvider codeProvider = new CSharpCodeProvider(new Dictionary() { { "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); 

请尝试以下选项:

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

我不确定这是否适用于您的情况,但如果确实如此,您可以使用条件编译指令包围此参数,以便它仅在调试模式下转储生成的程序集。

@bbmud的答案是正确的,虽然它错过了一个错误修复。 CSharpCodeGenerator(.NET中的类将C#代码编译为IL)设置为在创建pdb文件后立即删除它们,除非您向CompilerOptions字符串添加/debug:pdbonly 。 但是,如果这样做, 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文件。 results.TempFiles.AddExtension(fileExtension);else选项results.TempFiles.AddExtension(fileExtension); 告诉它将pdb视为所有临时文件,默认情况下是删除它们。