Visual studio 是否可以在Windows上使用Visual Studio调试使用Mono/XBuild编译的程序集?
我正在使用XBuild为Mono编译Visual Studio解决方案。这将生成程序集+mdb文件。是否可以在Windows上使用Visual Studio调试此程序集?使用“附加到进程”时,我无法调试,因为出现了一个错误,显示符号未加载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
我尝试通过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编译的程序集需要以下步骤:
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,请参见下面我的答案。