2009-05-17 20 views
19

私はC#ソースファイルを動的にロードしてプラグインとして実行するアプリケーションを持っています。メインアプリケーションをデバッグモードで実行しているときに、ダイナミックアセンブリにデバッグすることは可能ですか?明らかに、ブレークポイントを設定することは問題です。なぜなら、ソースは元のプロジェクトの一部ではありませんが、コードの例外を踏み入れることができなければなりませんか?コード化されたコンパイル済みコードでデバッグ/ブレークする方法

これは何かの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

(私はCodeDomのものに本当に混乱したことがない)System.Diagnostics.Debugger.Break()を配置しようとするとどうなりますか?あなたのコードのどこかに?あなたはそれに入ることができますか? – BFree

+0

これはうまくいきましたが、受け入れられた回答のオプションのみで動作します。 –

+0

私は不注意ごとにこの質問を二重にしました(私が探し求めた鍵ではありませんでした)。 http://stackoverflow.com/questions/1593920/debugging-a-generated-net-assembly-from-within-the-application-that-generated-it/1594910#1594910私は、インターフェイスを含むソリューションを追加しました。それが助けてくれることを願っています... – jdehaan

答えて

31

次のオプションを試してみてください:

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

私は、これはあなたのケースでOK動作しますが、それがない場合、それはダンプするように、あなたは、条件付きコンパイルディレクティブで、このパラメータを囲むことができるかどうかわかりません生成されたアセンブリはデバッグモードでのみ使用できます。

+2

それは2.42年後ですが、皆さん、すごいです! – Philip

+0

これは私の時間を節約して問題を発見しました:) – superachu

7

answer by @bbmudは正しいですが、1つのバグ修正がありません。 CSharpCodeGenerator(.NETのクラスでILにコンパイルするC#コード)は、作成した直後に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ファイルを保持するために、コンパイルを伝えます。 elseオプションがresults.TempFiles.AddExtension(fileExtension);の場合、pdbはすべての一時ファイルとして扱われ、デフォルトではそれらはすべて削除されます。

+0

'TempFileCollection'(" keepFiles "という名前の)の2番目の引数は、すでに' KeepFiles'プロパティをtrueに設定しています。 (または少なくともそれは.NET 4.0でそうする) –

関連する問題