当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在编码的编译代码中调试/中断》经验,为你挑选了2个好方法。

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

有没有办法让编码器生成这个或什么的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);

bbmud.. 37

请尝试以下选项:

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

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



1> bbmud..:

请尝试以下选项:

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

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


这是2.42年后,但是你先生,太棒了!

2> Boaz..:

@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文件.在其他的选项results.TempFiles.AddExtension(fileExtension);告诉它来治疗PDB作为默认方式删除所有临时文件.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有