我注意到Visual Studio可以使用DGML生成图表。
我想在我的C#应用程序中生成如下图所示的图表:
它不必像VS那样交互式。我只想生成静态的这样的图片,并将其保存为通用的图形文件,例如PNG。
是否有任何免费的.NET库可用于此目的?
我注意到Visual Studio可以使用DGML生成图表。
我想在我的C#应用程序中生成如下图所示的图表:
它不必像VS那样交互式。我只想生成静态的这样的图片,并将其保存为通用的图形文件,例如PNG。
是否有任何免费的.NET库可用于此目的?
稍晚了一些,但其实自己实现是相对容易的:
public class DGMLWriter
{
public struct Graph
{
public Node[] Nodes;
public Link[] Links;
}
public struct Node
{
[XmlAttribute]
public string Id;
[XmlAttribute]
public string Label;
public Node(string id, string label)
{
this.Id = id;
this.Label = label;
}
}
public struct Link
{
[XmlAttribute]
public string Source;
[XmlAttribute]
public string Target;
[XmlAttribute]
public string Label;
public Link(string source, string target, string label)
{
this.Source = source;
this.Target = target;
this.Label = label;
}
}
public List<Node> Nodes { get; protected set; }
public List<Link> Links { get; protected set; }
public DGMLWriter()
{
Nodes = new List<Node>();
Links = new List<Link>();
}
public void AddNode(Node n)
{
this.Nodes.Add(n);
}
public void AddLink(Link l)
{
this.Links.Add(l);
}
public void Serialize(string xmlpath)
{
Graph g = new Graph();
g.Nodes = this.Nodes.ToArray();
g.Links = this.Links.ToArray();
XmlRootAttribute root = new XmlRootAttribute("DirectedGraph");
root.Namespace = "http://schemas.microsoft.com/vs/2009/dgml";
XmlSerializer serializer = new XmlSerializer(typeof(Graph), root);
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
using (XmlWriter xmlWriter = XmlWriter.Create(xmlpath, settings))
{
serializer.Serialize(xmlWriter, g);
}
}
}
对于事后来的任何人,现在有一个NuGet包(GitHub),使创建DGML文件更加容易,包括支持样式和附加属性元数据。我最初使用了Simon的答案(对我的最初需求非常有效),然后在寻找改进输出方式的方法时,偶然发现了NuGet包。希望它能有所帮助。
对于任何对工具组合感兴趣的人,我一直在与 DgmlImage(NuGet 包; 注意,这将自己暴露为包中工具目录中的可执行文件,因此我手动将其提取到可以轻松调用它的位置),NDepend(商业软件,但非常方便,我相信对于开源项目是免费的)和 LINQPad(免费的,但我认为值得购买许可证)一起使用,在尝试设计主要重构时从临时查询中生成复杂代码库的图表。能够使用简单的 LINQ 查询对代码库提出问题、生成图表并快速连续显示结果是非常棒的体验。请注意,我与这些项目/产品没有任何关联,我只是因为使用这些工具组合的经验非常美妙,所以想向任何试图做类似事情的人推荐它。
我自己没有尝试过,但是读到了一些关于Graph#的推荐。
原始代码曾经在Codeplex上,但由于该网站已于2021年1月7日关闭,这里提供一个Github链接,可以找到多个分支:
https://github.com/search?p=1&q=graphsharp&type=Repositories
(感谢@ergohack提供)