質問者
CodeDomで実行時に生成したコードのデバッグ方法(ステップイン、ウォッチ、ブレークポイントなど)

質問
-
すべての返信
-
アドバイスありがとうございます。
Using cp As CodeDomProvider = CodeDomProvider.CreateProvider("VisualBasic")
Dim cps As New CompilerParameters
Dim cres As CompilerResults
cps.GenerateInMemory = True
cps.IncludeDebugInformation = True
cps.ReferencedAssemblies.Add("halcondotnet.dll")
cres = cp.CompileAssemblyFromSource(cps, [source])If cres.Errors.HasErrors = False Then
Dim asm As [Assembly] = cres.CompiledAssembly
InspectFunction = asm.GetType("MainClass")
Return True
Else
Return False
End If
End Usingのような感じでサブプログラムを作成し
InspectFunction.InvokeMember
で呼び出しております。
IncludeDebugInformation でデバッグ情報を組み込むことができるのはわかりましたが、それをどのように使ったらいいのかがわかりません。
VSの機能でプロセスのアタッチができ、PDBを使ってデバッグができるらしいのですが、できる限りVSを起動せず、メインプログラム内でトレース、ウォッチを動作させたいと思います。
現在SharpDevelopをトレースしながら中身を探っているのですがなかなか手ごわいです。
-
どのメソッドを使って、どこまでやっているのでしょうか?
コンパイルまでやっているのであれば、CompilerParameters.IncludeDebugInformation あたりを設定することが必要だとみられます。
(それだけで十分かは未検証)
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
ICorDebug インターフェイスにたどり着きました。これを深く調べていこうと思います。間違ってないでしょうか?
-
CodeDom から生成したものを InvokeMember で呼び出す場合 ICorDebug はおそらく利用できません。現在のアプリケーション(B)をホストする起動用の別プログラム(A)を用意する必要があるでしょう。
A.exe(ICorDebug を使用するだけの小さなプログラム) → B.exe(ICorDebug の対象、CodeDom を利用してデバッグしたいコードを動かす)
みたいなかんじですかね。
> 業務アプリを作成しており、ユーザーが作成したサブプログラムをユーザーによって
> デバッグする形をとりたいと思っています。私なら(時間や予算がどれぐらいとれるかによりますが) PowerShell を内蔵して独自の簡易デバッガを提供しますかね。これならかなり簡単にすみますし。
# 製品の導入先に有償のVisualStudioを含めたくないというだけであれば、SDKに含まれるような無償のデバッガを使わせるのも手かもしれません。
-
VSの機能でプロセスのアタッチができ、PDBを使ってデバッグができるらしいのですが、できる限りVSを起動せず、メインプログラム内でトレース、ウォッチを動作させたいと思います。
デバッガを作りたいと言うことですか?
ICorDebug を使ったことはないのですが、自分自身のプロセスをデバッグすることはできないと推測されます。
(ブレークしたら、自分自身も止まるので)すでに提案されているように、対象のプロセスを別プロセスとして起動するか、独自のデバッガの仕組みを用意するべきかと思われます。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。