Tag: 访问冲突

之前没有访问的访问冲突

我是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无法正确读取字符串并返回空指针。

PInvoking C ++ DLL时出现AccessViolationException(cdecl调用约定问题?)

我整天都在研究这个问题,而且我并不聪明: 我有一个C#DLL,PInvokes C ++ DLL中的方法。 在调试模式下编译时我没有遇到任何问题,但在Release模式下编译时,我得到一个AccessViolationException。 谷歌搜索这个问题告诉我,它可能是不合规的调用约定的问题。 代码现在在C#中看起来像这样: [return: MarshalAs(UnmanagedType.U1)] [DllImport(“Native.dll”, CallingConvention = CallingConvention.Cdecl)] internal static extern Boolean AMethod(Int32 mode, byte frame); 在C ++中: extern “C” { DLL_EXPORT bool AMethod(int mode, BYTE frame) { … } } 我已经在VS2010中使用__cdecl调用约定设置了C ++项目,但我仍然得到了AccessViolationException,我不知道我还能做些什么。 我应该注意我的C ++ DLL使用第三方DLL,我不知道他们使用什么调用约定。 任何帮助,将不胜感激! 哦,我的开发机器上没有例外,只在我的目标系统上。

在循环中使用方法Marshal.PtrToStructure时访问冲突exception

在我的程序(C#)中,我使用方法Marshal.PtrToStructure转换对象在循环中添加内存地址到结构。 在第一个元素,这项工作是正常的。 但是在第二个元素处,发生访问冲突exception。 访问冲突exception仅在win 7(64位)上发生,在win xp(32位)上不会发生。 我不知道原因和解决方案。 请帮我。 注意:我使用.NET Framework 3.5。 代码如下: [StructLayout(LayoutKind.Sequential)] public struct gpc_vertex { public float x; public float y; }; private ArrayList DoPolygonOperation() { IntPtr currentVertex = vertexList.vertexes; gpc_vertex oVertext = new gpc_vertex(); for (int j = 0; j < vertexList.num_vertices; j++) { PositionF pos = new PositionF(); oVertext = (gpc_vertex)Marshal.PtrToStructure(currentVertex, […]

访问冲突:尝试读取或写入受保护的内存

我有一个ac#(。net 4.0)winforms应用程序,每天每天工作8小时,在XP SP 3上运行。它在大多数情况下工作正常,有时持续数月。 然后它似乎陷入了一个糟糕的咒语,并且每天一次,连续几天,在不同的时间,出现访问冲突exception。 我已经尝试查看转储文件,并捕获访问冲突exception以查看堆栈; 无论哪种方式,我得到几乎相同的堆栈: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam) at System.Windows.Forms.NativeWindow.DefWndProc(Message& m) at System.Windows.Forms.ToolTip.WndProc(Message& msg) at System.Windows.Forms.ToolTip.ToolTipNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& […]

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 […]

找到System.AccessViolationException的原因

我们的应用程序经历了奇怪的致命System.AccessViolationException。 我们看到这些因为我们已经配置了AppDomain.CurrentDomain.UnhandledException事件来记录exception。 Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.Run(Form mainForm) at Bootstrap.Run() in e:\build-dir\src\Bootstrap.cs:line 25 除了“尝试读取或写入受保护的内存”之外,exception本身似乎不包含任何其他信息。这通常表明其他内存已损坏。 我们现在可以采取哪些步骤来解决问题? 有没有办法确定导致崩溃的非法地址或指针值? 我们可以找出导致问题的本机库代码吗? 我们可以启用更多的调试/跟踪吗? UPDATE […]

为什么.NET4.0无法捕获AccessViolationException

非常有趣的是,以下C#代码将在.NET4.0上崩溃,但在.NET2.0上运行良好。 C#代码 class Program { static void Main(string[] args) { try { ExceptionTest(); Console.WriteLine(“Done!”); } catch (Exception e) { Console.WriteLine(“Error !!!”); Console.WriteLine(e.Message); } } [DllImport(“badapp”)] private static extern int ExceptionTest(); } C ++代码 extern “C” __declspec(dllexport) int ExceptionTest() { IUnknown* pUnk = NULL; pUnk->AddRef(); return 0; } 如果针对.NET2.0编译上面的C#代码,一切正常。 只针对.NET4.0进行编译会使其在运行时崩溃。 我怀疑自.NET4.0以来系统exception捕获机制已经改变。 有任何想法吗?