【发布时间】:2010-01-30 08:17:01
【问题描述】:
我正在向 Graphviz as shown here 发起 P/调用。当我写那个博客条目时,代码运行得很好。现在,我正在整理一个 HttpModule,它使用该代码呈现 Graphviz 图形,但我在 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 无法正确读取字符串并返回空指针。
【问题讨论】:
-
相同的数据?操作系统位数相同(32/64 位)?你知道 AV 是否真的在那条线上,还是在 agmemread() 调用中的某个地方?
-
相同的数据,相同的操作系统。
agmemread是一个原生函数,所以我不知道它在后台做了什么导致访问冲突。 -
MarshalAs(UnmanagedType.LPStr) 怎么样?我对 Graphviz 一无所知,但 Bing 告诉我参数是“char *”,而不是 wchar。
-
LPStr也不起作用。我试过StringBuilder,因为参数是char *,但什么也没做。LPWStr是唯一接近工作的东西。
标签: c# .net pinvoke graphviz access-violation