Visual studio 是否可以在Windows上使用Visual Studio调试使用Mono/XBuild编译的程序集?

Visual studio 是否可以在Windows上使用Visual Studio调试使用Mono/XBuild编译的程序集?,visual-studio,debugging,mono,xbuild,Visual Studio,Debugging,Mono,Xbuild,我正在使用XBuild为Mono编译Visual Studio解决方案。这将生成程序集+mdb文件。是否可以在Windows上使用Visual Studio调试此程序集?使用“附加到进程”时,我无法调试,因为出现了一个错误,显示符号未加载 我尝试通过Mono.Cecil(AssemblyDefinition、MdbReaderProvider、PdbWriterProvider)为这个程序集生成pdb文件,并通过Debug/Windows/Modules和“Load Symbol From/Sy

我正在使用XBuild为Mono编译Visual Studio解决方案。这将生成程序集+mdb文件。是否可以在Windows上使用Visual Studio调试此程序集?使用“附加到进程”时,我无法调试,因为出现了一个错误,显示符号未加载


我尝试通过Mono.Cecil(AssemblyDefinition、MdbReaderProvider、PdbWriterProvider)为这个程序集生成pdb文件,并通过Debug/Windows/Modules和“Load Symbol From/Symbol Path”手动加载它,这实际上加载了符号(显示在模块窗口中)但这也不能启用调试。

只需一次小小的努力,这是可能的

您需要将mono
mdb
文件转换为
pdb
文件。之后,VS应该能够与您一起逐步完成代码(如果您也有源代码的话)-请参见下文


Mono.Cecil确实经常更改,因此您可能会发现API为此做了一些更改。

在比较VS2012版本和XBuild版本之间的程序集定义时,我注意到XBuild没有生成DebuggableAttribute。如果缺少此属性,则即使手动加载符号,也无法使用Visual Studio 2012进行调试。使用VS2012调试使用Mono/XBuild编译的程序集需要以下步骤:

  • 使用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});
    

    我不相信这是可能的(但我希望被证明是错误的)。当我在很多年前创建Mono的
    .mdb
    文件格式时,PDB是没有文档记录和专有的,所以我们不能简单地使用它。好吧,这在今天仍然是正确的(至少维基百科是这样说的)。可能有一些工具可以编写这些文件,但它们无法生成完全“正确”的PDB,除非它们由Microsoft编写或发布文件格式。但是,我也希望被证明是错误的。仅供参考,如果你做的是相反的事情,请使用
    pdb2mdb some.dll
    将pdb转换为mono格式。我在提问之前也找到了这篇文章,并尝试了它(请参阅问题的第二部分-通过AssemblyDefinition,MdbReaderProvider,PdbWriterProvider),也许我做错了什么-但是VS没有自动加载符号,当我通过Debug/Windows/Modules和“load Symbol From/Symbol Path”手动加载符号时,没有任何更改。当我在@home时,我将发布我的代码片段。你还必须添加一个DebuggableAttribute,请参见下面我的答案。