2009-05-17 17 views
19

Mam aplikację, która dynamicznie ładuje do góry pliki źródłowe C# i uruchamia je jako wtyczki. Kiedy uruchamiam główną aplikację w trybie debugowania, czy możliwe jest debugowanie w zespole dynamicznym? Oczywiście ustawienie pułapek jest problematyczne, ponieważ źródło nie jest częścią oryginalnego projektu, ale czy powinienem móc wkraczać lub łamać wyjątki dla kodu?Jak debugować/włamać się w skompilowanym kodeksie

Czy istnieje sposób na uzyskanie kodeksu do generowania PDB dla tego czy coś takiego?

Oto kod, którego używam do kompilacji dynamicznej.

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

Z ciekawości (nigdy tak naprawdę nie robiłem rzeczy CodeDom), co się stanie, jeśli spróbujesz umieścić System.Diagnostics.Debugger.Break(); gdzieś w swoim kodzie? Czy możesz wejść do tego? – BFree

+0

to działało, ale tylko z opcjami w zaakceptowanej odpowiedzi. –

+0

Powieliłem to pytanie za nieuwagę (kod nie był kluczem, którego szukałem). http://stackoverflow.com/questions/1593920/debugging-a-generated-net-assembly-from-within-application-that-generated-it/1594910#1594910. Dodałem rozwiązanie obejmujące interfejs. Mam nadzieję, że to pomoże ... – jdehaan

Odpowiedz

31

Spróbuj następujące opcje:

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

Nie jestem pewien, czy to działa OK w twoim przypadku, ale jeśli tak się stanie, można otoczyć to parametry z warunkowym dyrektywy kompilacji, tak, że zrzuca wygenerowany zestaw tylko w trybie debugowania.

+2

To 2.42 lata później, ale proszę pana, są NIESAMOWITE! – Philip

+0

Zaoszczędził mój czas, aby dowiedzieć się o problemie :) – superachu

7

Numer answer by @bbmud jest poprawny, chociaż brakuje jednego błędu. CSharpCodeGenerator (klasa w .NET, kompiluje kod C do IL) jest ustawiony do usuwania plików pdb natychmiast po ich utworzeniu, CHYBA dodawać /debug:pdbonly do ciągu CompilerOptions. Jeśli jednak to zrobisz, flaga IncludeDebugInformation zostanie zignorowana, a kompilator wygeneruje zoptymalizowany kod, który jest trudny do debugowania. Aby tego uniknąć, musisz wyraźnie powiedzieć Generatorowi Kodów, aby zachować wszystkie pliki.

Oto pełna przepis:

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

Oto część winowajcą kodeksu 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) opowiada kompilacji zachować WPB plików. Opcja w innym przypadku z results.TempFiles.AddExtension(fileExtension); mówi, że traktuje pdb jako wszystkie pliki tymczasowe, które domyślnie usuwają je.

+0

Drugi argument w 'TempFileCollection' (nazwany" keepFiles ") już ustawia właściwość' KeepFiles' na true. (lub przynajmniej robi to w .NET 4.0) –

Powiązane problemy