VS2012ビルドとXBuildビルドの間でアセンブリ定義を比較すると、XBuildがDebuggableAttributeを生成していないことに気付きました。この属性がない場合、シンボルを手動でロードしても、VisualStudio2012でデバッグすることはできません。Mono / XBuildwithVS2012でコンパイルされたアセンブリをデバッグするには次の手順が必要です。
- XBuildを使用してソリューションをコンパイルします
- デバッグするアセンブリごとにMono.Cecilを使用して、pdbファイルを生成し、DebuggableAttributeを挿入します(以下のコードを参照)。
- XBuildコンパイル済みプログラムで開始します
- 実行中のプログラムをデバッグするには、VS2012の「デバッグ/プロセスにアタッチ...」を使用します
pdbを生成し、DebuggableAttributeを挿入するためのコード:
string assemblyPath = @"HelloWorld.exe";
var assemblyDefinition = AssemblyDefinition.ReadAssembly(assemblyPath,
new ReaderParameters() { SymbolReaderProvider = new MdbReaderProvider(), ReadSymbols = true});
CustomAttribute debuggableAttribute = newCustomAttribute(
assemblyDefinition.MainModule.Import(
typeof(DebuggableAttribute).GetConstructor(new[] { typeof(bool), typeof(bool) })));
debuggableAttribute.ConstructorArguments.Add(new CustomAttributeArgument(
assemblyDefinition.MainModule.Import(typeof(bool)), true));
debuggableAttribute.ConstructorArguments.Add(new CustomAttributeArgument(
assemblyDefinition.MainModule.Import(typeof(bool)), true));
assemblyDefinition.CustomAttributes.Add(debuggableAttribute);
assemblyDefinition.Write(assemblyPath,
new WriterParameters() { SymbolWriterProvider = new PdbWriterProvider(), WriteSymbols = true});