2

我不能发布代码(专有问题),但有谁知道什么类型的东西会在 C# 中导致以下错误。当另一个客户端结束呼叫时,我编写的VOIP客户端(使用counterpath api)抛出了它。错误是:

System.AccessViolationException was unhandled
  Message="Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
  Source="System.Windows.Forms"
  StackTrace:
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 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 CollabAnalysisSF.Edge.GUI.Forms.Program.Main() in d:\data\beyerss\Desktop\client\GUI\ARGui\Program.cs:line 18
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

更新:
原来我们使用的一个库正在发送一个我们不知道的事件,问题就在某个地方。现在修好了。

4

3 回答 3

3

一些可能性的列表:

  • 对象在被释放后被使用。如果您在终结器中处理托管对象,这可能会发生很多(您不应该这样做)。
  • 您正在使用的对象之一的无人管理实现存在错误,它破坏了进程内存堆。在 DirectX、GDI 和其他方面经常发生。
  • 在托管-非托管边界上进行混编是有缺陷的。确保在将托管指针用于代码的非托管部分之前将其固定。
  • 您正在使用不安全的块并用它做有趣的事情。

在您的情况下,这可能是 Windows 窗体的问题。但问题不在于它正在发生,而在于它没有被正确报告;你可能还是做错了什么。

您是否能够使用 HWND 确定导致错误的控件是什么?它总是一样吗?这个控件是否在应用程序崩溃之前做了一些有趣的事情?控件的非托管部分是自定义窗口还是标准控件?

于 2008-08-20T13:44:22.980 回答
1

如果您正在调用非托管代码(例如 dll),则可能会出现这种问题。当编组出现严重错误时,可能会发生这种情况。

你能告诉我们你是否在调用非托管代码吗?如果是这样,您是否使用默认编组或更具体的东西?从堆栈跟踪的外观来看,您是否使用了不安全的代码,例如指针等?这可能是你的问题。

于 2008-08-20T13:30:30.657 回答
0

这是更详细的堆栈跟踪。在我看来,它与 System.Windows.Form.dll 有关

TargetSite 被列为{IntPtr DispatchMessageW(MSG ByRef)}
模块并在它具有 System.windows.forms.dll 的模块下

于 2008-08-20T13:46:56.497 回答