22 Stimmen

Debuggen/Fehlerbehebung im kompilierten Code von Codedom

Ich habe eine Anwendung, die c#-Quelldateien dynamisch lädt und sie als Plugins ausführt. Wenn ich die Hauptanwendung im Debug-Modus ausführe, ist es dann möglich, in der dynamischen Assembly zu debuggen? Offensichtlich ist das Setzen von Haltepunkten problematisch, da der Quellcode nicht Teil des ursprünglichen Projekts ist, aber sollte ich in der Lage sein, in den Code einzugreifen oder bei Ausnahmen zu unterbrechen?

Gibt es eine Möglichkeit, Codedom dazu zu bringen, PDBs dafür zu generieren oder ähnliches?

Hier ist der Code, den ich für die dynamische Kompilierung verwende.

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 Stimmen

Nur aus Neugier (ich habe nie wirklich mit dem CodeDom-Zeug herumgespielt), was passiert, wenn Sie versuchen, ein System.Diagnostics.Debugger.Break(); irgendwo in Ihrem Code zu setzen? Können Sie dann in den Code einsteigen?

0 Stimmen

Das hat funktioniert, aber nur mit den Optionen in der akzeptierten Antwort.

0 Stimmen

Ich habe diese Frage aus Versehen dupliziert (Codedom war nicht das Schlüsselwerk, nach dem ich gesucht habe). stackoverflow.com/questions/1593920/ . Ich habe eine Lösung mit einer Schnittstelle hinzugefügt. Ich hoffe, es hilft...

40voto

bbmud Punkte 2658

Probieren Sie die folgenden Optionen aus:

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

Ich bin nicht sicher, ob dies in Ihrem Fall funktioniert, aber wenn ja, können Sie diese Parameter mit einer bedingten Kompilierungsanweisung umgeben, so dass die generierte Assembly nur im Debug-Modus ausgegeben wird.

4 Stimmen

Es ist 2,42 Jahre später, aber Sie, mein Herr, sind GROSSARTIG!

0 Stimmen

Es hat mir Zeit erspart, das Problem herauszufinden :)

0 Stimmen

Heute, 11 Jahre später, sind diese Informationen immer noch Gold wert. Danke!

11voto

Boaz Punkte 23533

El Antwort von @bbmud ist korrekt, auch wenn ein Fehler nicht behoben wurde. Der CSharpCodeGenerator (die Klasse in .NET, die C#-Code zu IL kompiliert) ist so eingestellt, dass er pdb-Dateien sofort nach ihrer Erstellung entfernt, WENN Sie nicht Folgendes hinzufügen /debug:pdbonly in die Zeichenkette CompilerOptions. Wenn Sie dies jedoch tun, wird die IncludeDebugInformation Flag wird ignoriert und der Compiler erzeugt optimierten Code, der schwer zu debuggen ist. Um dies zu vermeiden, müssen Sie dem Codegenerator ausdrücklich sagen, dass er alle Dateien behalten soll.

Hier ist das vollständige Rezept:

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

Hier ist der schuldige Teil des Codes von 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);
    }

El TempFiles.AddExtension(fileExtension, true) weist die Kompilierung an, die pdb-Dateien zu behalten. Die sonst Option von results.TempFiles.AddExtension(fileExtension); weist es an, pdb als alle temporären Dateien zu behandeln, was standardmäßig bedeutet, sie zu löschen.

1 Stimmen

Das zweite Argument in TempFileCollection (namens "keepFiles") setzt bereits die KeepFiles Eigenschaft auf true setzen (oder zumindest in .NET 4.0)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X