Tag: graphviz

之前没有访问的访问冲突

我是P /调用Graphviz ,如下所示 。 当我写这篇博客文章时,代码工作正常。 现在,我正在整理一个使用该代码渲染Graphviz图形的HttpModule ,但是我在agmemread得到了一个AccessViolationException 。 // Native signature Agraph_t agmemread(char *); // P/Invoke Signature [DllImport(LIB_GRAPH)] private static extern IntPtr agmemread(string data); // Usage IntPtr g = agmemread(data); 就像我说的,这之前完美无缺。 但现在,我无法让我的代码适用于任何事情。 甚至我基于相同代码的旧Graphviz应用程序也不再适用。 我可能有什么改变会导致这种情况? 我甚至没有下载新版本的Graphviz或任何东西,所以DLL都是一样的。 编辑:我尝试将string更改为StringBuilder ,但这产生了相同的结果。 然后,我添加了一个MarshalAs属性: static extern IntPtr agmemread([MarshalAs(UnmanagedType.LPWStr)] string data); 有了它,我不再获得AccessViolationException ,但Graphviz无法正确读取字符串并返回空指针。

GraphViz C#interop偶尔会导致AccessViolationException

在ImplicitOperator中使用David Brown的可下载示例我将一个经常工作的DOT文件的GraphViz渲染器组合到一个内存中的图像中。 不幸的是,我的版本因为我已经使用的IIS 7 ASP.NET Web应用程序的8次执行中的1次估计失败率。我知道DOT文件数据是一致的,因为我将失败的实例与工作实例,他们是相同的。 由于大卫的网站似乎暗示博客的未来不确定,我将在这里重印互联文件。 希望他不介意。 失败是在示例的末尾,在第三个语句集的RenderImage中。 我已经注意到// TODO的失败行:……失败总是发生在那里(如果它发生的话)。 通过这一行,g和gvc指针不为零,并且正确填充了布局字符串。 我真的不希望任何人在运行时调试它。 相反,我希望对互操作代码的一些静态分析可能会揭示问题。 我想不出这里有任何先进的编组技术 – 两个IntPtrs和一个字符串不需要很多帮助,对吧? 谢谢! 旁注:我看了一下MSAGL的试用版,我没有留下深刻的印象 – 微软的99美元,我希望节点布局和/或文档的更多function可以解释我所缺少的内容。 也许我从QuickGraph到AGL的快速端口不公平地偏向于我的经验,因为这些方法存在一些根本的差异(例如,以边缘为中心与以节点为中心)。 public static class Graphviz { public const string LIB_GVC = “gvc.dll”; public const string LIB_GRAPH = “graph.dll”; public const int SUCCESS = 0; /// /// Creates a new Graphviz context. /// [DllImport(LIB_GVC)] public […]