我正在 P/Invoking 到 Graphviz ,如下所示。当我写那个博客条目时,代码运行得很好。现在,我正在整理一个HttpModule
使用该代码呈现 Graphviz 图形的组件,但我得到了一个AccessViolationException
at agmemread
。
// 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 无法正确读取字符串并返回一个空指针。