在比较 VS2012 构建和 XBuild 构建之间的程序集定义时,我注意到 XBuild 没有生成 DebuggableAttribute。如果缺少此属性,则无法使用 Visual Studio 2012 进行调试,即使您手动加载符号也是如此。使用 VS2012 调试使用 Mono / XBuild 编译的程序集需要以下步骤:
- 使用 XBuild 编译解决方案
- 对要调试的每个程序集使用 Mono.Cecil 以生成 pdb 文件并注入 DebuggableAttribute(请参见下面的代码)
- 从 XBuild 编译程序开始
- 使用 VS2012 中的“Debug / Attach to process...”来调试正在运行的程序
生成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});