【发布时间】:2011-02-25 01:26:02
【问题描述】:
在 Visual Studio 调试模式下,可以将鼠标悬停在变量上以显示其值,然后右键单击“复制”、“复制表达式”或“复制值”。
如果变量是一个对象而不仅仅是一个基本类型,则有一个 + 号来扩展和探索该对象。有没有办法将所有内容复制到剪贴板?
【问题讨论】:
标签: visual-studio visual-studio-2010 debugging
在 Visual Studio 调试模式下,可以将鼠标悬停在变量上以显示其值,然后右键单击“复制”、“复制表达式”或“复制值”。
如果变量是一个对象而不仅仅是一个基本类型,则有一个 + 号来扩展和探索该对象。有没有办法将所有内容复制到剪贴板?
【问题讨论】:
标签: visual-studio visual-studio-2010 debugging
在即时窗口中,键入
?name_of_variable
这将打印出所有内容,您可以手动将其复制到您想要的任何位置,或使用即时窗口的日志记录功能将其自动写入文件。
更新:我假设您问的是如何复制/粘贴值的嵌套结构,以便您可以以文本方式搜索它,或者您可以将其保存在一边,然后再保存比较对象的状态。如果我是对的,您可能想查看我创建的 Visual Studio 商业扩展,称为 OzCode,它可以让您通过“搜索”和“比较”功能更轻松地完成这些事情。
更新 2 为了回答 @ppumkin 的问题,我们的 new EAP 有一个新的导出功能,允许用户将变量值导出到 Json、XML、Excel 或 C# 代码。
全面披露:我是我在此描述的工具的共同创造者。
【讨论】:
您可以在即时窗口中运行以下代码,它会将对象的序列化 XML 表示形式导出到 xml 文件中:
(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)
【讨论】:
Cannot evaluate expression because the code of the current method is optimized.???
File.WriteAllText(@"c:\movie.json", JsonConvert.SerializeObject(movie));
The debugger is unable to evaluate this expression。我正在使用 Visual Studio 2019;我用System.Collections.Generic.List 1[[System.ValueTuple 3[[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7]]类型的变量名替换了obj
有一个名为 Object Exporter 的扩展程序可以方便地执行此操作。
http://www.omarelabd.net/exporting-objects-from-the-visual-studio-debugger/
分机号:https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f
【讨论】:
VSIXInstaller.NoApplicableSKUsException: This extension is not installable on any currently installed products.
来自https://stackoverflow.com/a/23362097/2680660的最受欢迎回答:
如果你运气好的话,你的 appdomain 中已经有了 Json.Net。其中 将其弹出到您的即时窗口中:
Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)
【讨论】:
您可以为该对象添加监视,然后在监视窗口中展开并选择要复制的所有内容,然后将其复制。
【讨论】:
通过使用attributes to decorate your classes and methods,您可以在使用DebuggerDisplay attribute 进行调试期间从对象显示中获得特定值,例如
[DebuggerDisplay("Person - {Name} is {Age} years old")]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
【讨论】:
我总是用:
string myJsonString = JsonConvert.SerializeObject(<some object>);
然后我复制字符串值,不幸的是它也复制了反斜杠。
要消除反冲,请访问此处: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_replace
然后在<p id="demo">Visit Microsoft!</p> 元素中将文本替换为您复制的文本。
然后将var res = str.replace("Microsoft", "W3Schools"); 行替换为
var res = str.replace(/\\/g, '')
运行这些新更改,但不要忘记点击右侧的“尝试”按钮。
现在您应该拥有 json 格式的对象的所有文本,您可以将其放入 json 格式化程序中,例如 http://jsonformatter.org 或创建一个 POCO,您现在可以使用 http://json2csharp.com/
【讨论】:
Google 将我引向了这个 8 年前的问题,我最终使用 ObjectDumper 来实现与复制粘贴调试器数据非常相似的功能。轻而易举。
我知道专门针对调试器 中的信息提出的问题,但 ObjectDumper 提供的信息基本相同。我假设那些用谷歌搜索这个问题的人和我一样,只需要用于调试目的的数据,而不关心它在技术上是否来自调试器。
【讨论】:
我知道我参加聚会有点晚了,但如果您更喜欢 JSON 输出,我编写了一个用于序列化对象的 JSON 实现。使用 Newtonsoft.Json 引用。
private static void WriteDebugJSON (dynamic obj, string filePath)
{
using (StreamWriter d = new StreamWriter(filePath))
{
d.Write(JsonConvert.SerializeObject(obj));
}
}
【讨论】:
如果你有一个列表并且你想找到一个特定的变量: 在即时窗口中,键入
myList.Any(s => s.ID == 5062);
如果返回 true
var myDebugVar = myList.FirstOrDefault(s => s.ID == 5062);
?myDebugVar
【讨论】:
我刚刚右键单击变量并选择了AddWatch,这将打开包含所有值的监视窗口。我选择了所有并将其粘贴到文本编辑器中,仅此而已。
【讨论】:
这里有用的提示,我会添加我的偏好,以便我下次在这里结束时再次问这个问题。 如果你不介意添加一个不需要输出文件的扩展,或者这样,mladen mihajlovic 的 Visual Studio 的 Hex Visualizer 扩展,他自 2015 年以来就完成了版本。 通过局部变量窗口中的常用放大镜视图对象提供数组的良好显示。 https://marketplace.visualstudio.com/items?itemName=Mika76.HexVisualizer2019是2019版。
【讨论】:
如果您处于调试模式,您可以通过在调试终端中写入 copy() 来复制任何变量。
这适用于嵌套对象,还可以删除截断并复制完整的值。
提示:您可以右键单击一个变量,然后单击Copy as Expression,然后将其粘贴到复制功能中。
【讨论】:
这是一个很棒的方法!
Sandbox.cs 临时测试,或者您可以创建一个控制台应用程序。代码:
[TestClass]
public class Sandbox
{
[TestMethod]
public void GetInitializerCode()
{
var db = TestServices.GetDbContext();
var list = db.MyObjects.ToList();
var literal = ObjectDumper.Dump(list, new DumpOptions
{
DumpStyle = DumpStyle.CSharp,
IndentSize = 4
});
Console.WriteLine(literal); // Some test runners will truncate this, so use the file in that case.
File.WriteAllText(@"C:\temp\dump.txt", literal);
}
}
我曾经使用过 Object Exporter,但它已经使用了 5 年,并且在 Visual Studio 中不再支持。似乎 Visual Studio Extensions 来来去去,但我们希望这个 NuGet 包能够继续存在! (在撰写本文时它也在积极维护中。)
【讨论】: