C#错误“尝试读取或写入受保护内存”或“外部组件抛出异常”我有一个调用COM对象(非托管代码)的C#程序(目标框架.NET4.0),所有对象都得到妥善管理,不再需要时销毁等。我还有一些异常处理程序,没有用于自定义异常的try/catch块.但是有时程序会崩溃,主要是随机行为。堆垛跟踪也有所有不同,例如:System.AccessViolationException未处理Message=Attemptedtoreadorwriteprotectedmemory。这通常表明其他内存已损坏。Source=System.Windows.FormsStackTrace:在System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&msg)在System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtrdwComponentID,Int32原因,Int32pvLoopData)在System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32原因,ApplicationContext上下文)在System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32原因,ApplicationContext上下文)在System.Windows.Forms。Application.Run(FormmainForm)atIndexerTester.Program.Main()inD:TesterProgram.cs:line17InnerException:在Program.cs中,第17行:Application.Run(newForm1());System.Runtime.InteropServices.SEHException未处理Message=外部组件抛出异常。Source=System.Windows.FormsErrorCode=-2147467259StackTrace:在System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&msg)在System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtrdwComponentID,Int32原因,Int32pvLoopData)在System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32原因,ApplicationContext上下文)在System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32原因,ApplicationContext上下文)在System.Windows.Forms.Application.Run(FormmainForm)atIndexerTester.Program.Main()inD:TesterProgram.cs:line17atSystem.AppDomain._nExecuteAssembly(RuntimeAssemblyassembly,String[]args)atSystem.AppDomain.ExecuteAssembly(Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()在System.Threading.ThreadHel处的字符串assemblyFile、证据assemblySecurity、String[]args)per.ThreadStart_Context(对象状态)在System.Threading.ExecutionContext.Run(ExecutionContextexecutionContext,ContextCallback回调,对象状态,BooleanignoreSyncCtx)在System.Threading.ExecutionContext.Run(ExecutionContextexecutionContext,ContextCallback回调,对象状态)在System。.ThreadHelper.ThreadStart()InnerException:我正在孤立地试图找到此错误的根源感谢您的帮助。异常的来源是无人参与的代码,很可能是您的COM组件。堆栈跟踪表明在您的消息循环中捕获了异常,这可能是.NET代码对STA(单线程单元)中的COM对象进行跨单元调用的结果。然后使用Windows消息对方法调用进行编组并发送到组件。进行跨单元调用没有错,但我看到一些COM组件在从不同单元发出指针时没有正确编组,并且通常对COM中的线程规则一无所知。如果您的应用程序中有任何类型的多线程,您绝对应该看看这个。这些“损坏的”COM对象在从主STA线程调用时表现良好,但在不同线程上调用或创建时可能会失败。更具体地说:假设应用程序UI线程在启动时进入STA(单线程单元)并创建COM组件。然后创建一个新线程(将在另一个公寓中)并从该线程调用COM组件上的方法。这是一个跨公寓的电话。您的COM组件只能在UI线程(它所在的公寓的线程)上执行。COM框架会注意到您正在进行跨公寓调用,并且会将调用序列化到缓冲区中(以COM术语编组调用)。然后使用Windows消息将该缓冲区发送到UI线程。如果您的应用程序没有窗口,COM将创建一个隐藏窗口来接收这些消息。应用程序的消息循环随后将解压缩编组调用并在UI线程上执行它。现在,假设您或COM组件不了解COM单元和编组规则。方法调用中的参数之一是指针或解析为指针的东西,而该指针在COM组件的单元中无效。然后在COM组件解析指针时会出现错误。.NET运行时将检测到这一点并抛出您看到的两种异常类型之一。但是,在UI线程的消息循环中抛出此异常,您无权访问某些代码。在调用者处使用try-catch块无助于捕获异常,因为它是在另一个线程上抛出的。在任何情况下,您都不应该捕获异常,因为它表明您的应用程序中确实发生了一些糟糕的事情。作为记录,错误代码-2147467259是0x8004005,转换为E_FAIL。不是很有帮助,但您遇到的错误很可能是由于在COM组件中使用了无效指针。要解决此问题,您必须正确使用COM组件和/或修复组件中的任何损坏代码。您的COM组件之一导致异常,如下所示:Message=Externalcomponentthrowsanexception这两行应该可以帮助您找到导致问题的COM组件和被调用的方法:atSystem.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&msg)atSystem.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtrdwComponentID,Int32reason,Int32pvLoopData)我假设你已经编写了一个包装器来连接这些COM组件?还是您使用直接呼叫来呼叫?也许InnerException信息会为您提供更多详细信息。基本上查找您可能认为与这些COM组件相关的任何内容。以上就是C#学习教程的全部内容:C#错误“试图读取或写入受保护的内存”或者“外部组件抛出异常”,如果对大家有用需要进一步了解C#学习教程,希望大家多多关注吧——本文整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
