我有一个应用程序可以动态加载c#源文件并将它们作为插件运行。当我在调试模式下运行主应用程序时,是否可以调试到动态程序集?显然设置断点是有问题的,因为源不是原始项目的一部分,但是我是否应该介入或打破代码的异常?
有没有办法让encodeom为此生成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 :(得分:37)
尝试以下选项:
parameters.GenerateInMemory = false; //default
parameters.TempFiles = new TempFileCollection(Environment.GetEnvironmentVariable("TEMP"), true);
parameters.IncludeDebugInformation = true;
我不确定这是否适用于您的情况,但如果确实如此,您可以使用条件编译指令包围此参数,以便它仅在调试模式下转储生成的程序集。
答案 1 :(得分:10)
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文件。 results.TempFiles.AddExtension(fileExtension);
的 else 选项告诉它将pdb视为所有临时文件,默认情况下将其删除。