仅在 VS 2010 上运行时:COMException:灾难性故障:错误代码:-2147418113

Posted

技术标签:

【中文标题】仅在 VS 2010 上运行时:COMException:灾难性故障:错误代码:-2147418113【英文标题】:Only while running on VS 2010: COMException: Catastrophic Failure: Error Code: -2147418113 【发布时间】:2011-06-21 01:15:53 【问题描述】:

我遇到了这个错误:尝试在 .Net Framework 4.0 中使用旧 DLL 如果我将项目目标类型更改为 3.5,则不会出现错误。 奇怪的是,这一切只发生在 VS 2010 中运行时。如果我从 Windows 资源管理器运行可执行文件,在 3.5 和 4.0 中不会出现问题。 似乎vshost中的一些错误? VS 2010 Express,还是 .net 框架?

更新:此 BUG 仅发生在 WPF 独立应用程序上,如果将其更改为 XBAP WPF 我可以使用 dll 而不会出现更大的问题,只有一条消息告诉它不能停止调试。

我将把这个问题留在这里,等着看看 connect.microsoft.com 上是否有关于这张票的一些进展。

有没有办法让我的 .net4 app.config 使用 .net 3.5 加载这个特定的 dll(CobreBemX.dll)?

我认为这是一些错误然后我将其提交给https://connect.microsoft.com/VisualStudio/feedback/details/636697/comexception-was-unhandled-catastrophic-failure

这是它抛出 COMException 的代码:

//Cria instância do objeto CobreBemX
CobreBemX.ContaCorrente _CobreBemX = new CobreBemX.ContaCorrenteClass();
//Monta arquivo de licença de teste para banco 001 carteira 18
_CobreBemX.ArquivoLicenca = @"C:\CobreBemX\Exemplos\Licencas\237-09.conf"; // THIS LINES CAUSES THE PROBLEM ON .NET 4.0    IF I CHANGE TARGET FRAMEWORK TO 3.5  NO PROBLEM HAPPENS

这是堆栈跟踪:

System.Runtime.InteropServices.COMException 未处理 消息=Falha catastrófica 来源=CobreBemX.ContaCorrente 错误代码=-2147418113 堆栈跟踪: 在 CobreBemX.ContaCorrenteClass.set_ArquivoLicenca(字符串值) 在 EmissorBoletosWindows.MainWindow.button1_Click(Object sender, RoutedEventArgs e) 在 C:\inetpub\wwwroot\CRM\Cobranca\EmissorBoletosWindows\EmissorBoletosWindows\MainWindow.xaml.cs:line 90 在 C:\inetpub\wwwroot\CRM\Cobranca\EmissorBoletosWindows\EmissorBoletosWindows\MainWindow.xaml.cs: 39 中的 EmissorBoletosWindows.MainWindow.Window_Loaded(Object sender, RoutedEventArgs e) 在 System.Windows.RoutedEventHandlerInfo.InvokeHandler(对象目标,RoutedEventArgs routedEventArgs) 在 System.Windows.EventRoute.InvokeHandlersImpl(对象源,RoutedEventArgs args,布尔 reRaised) 在 System.Windows.UIElement.RaiseEventImpl(DependencyObject 发件人,RoutedEventArgs 参数) 在 System.Windows.UIElement.RaiseEvent(RoutedEventArgs e) 在 System.Windows.BroadcastEventHelper.BroadcastEvent(DependencyObject 根,RoutedEvent routedEvent) 在 System.Windows.BroadcastEventHelper.BroadcastLoadedEvent(对象根) 在 MS.Internal.LoadedOrUnloadedOperation.DoWork() 在 System.Windows.Media.MediaContext.FireLoadedPendingCallbacks() 在 System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks() 在 System.Windows.Media.MediaContext.RenderMessageHandlerCore(对象 resizedCompositionTarget) 在 System.Windows.Media.MediaContext.RenderMessageHandler(对象 resizedCompositionTarget) 在 System.Windows.Media.MediaContext.Resize(ICompositionTarget resizedCompositionTarget) 在 System.Windows.Interop.HwndTarget.OnResize() 在 System.Windows.Interop.HwndTarget.HandleMessage(WindowMessage 消息,IntPtr wparam,IntPtr lparam) 在 System.Windows.Interop.HwndSource.HwndTargetFilterMessage(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam,Boolean& 处理) 在 MS.Win32.HwndWrapper.WndProc(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam,Boolean& 处理) 在 MS.Win32.HwndSubclass.DispatcherCallbackOperation(对象 o) 在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托回调,对象 args,Int32 numArgs) 在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(对象源,委托方法,对象 args,Int32 numArgs,委托 catchHandler) 在 System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority 优先级,TimeSpan 超时,委托方法,对象 args,Int32 numArgs) 在 MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam) 在 MS.Win32.UnsafeNativeMethods.ShowWindow(HandleRef hWnd,Int32 nCmdShow) 在 System.Windows.Window.ShowHelper(对象 booleanBox) 在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托回调,对象 args,Int32 numArgs) 在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(对象源,委托方法,对象 args,Int32 numArgs,委托 catchHandler) 在 System.Windows.Threading.DispatcherOperation.InvokeImpl() 在 System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(对象状态) 在 System.Threading.ExecutionContext.runTryCode(对象 userData) 在 System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode 代码,CleanupCode backoutCode,对象 userData) 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback 回调,对象状态) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态,布尔 ignoreSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态) 在 System.Windows.Threading.DispatcherOperation.Invoke() 在 System.Windows.Threading.Dispatcher.ProcessQueue() 在 System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam,Boolean& 处理) 在 MS.Win32.HwndWrapper.WndProc(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam,Boolean& 处理) 在 MS.Win32.HwndSubclass.DispatcherCallbackOperation(对象 o) 在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托回调,对象 args,Int32 numArgs) 在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(对象源,委托方法,对象 args,Int32 numArgs,委托 catchHandler) 在 System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority 优先级,TimeSpan 超时,委托方法,对象 args,Int32 numArgs) 在 MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam) 在 MS.Win32.UnsafeNativeMethods.DispatchMessage(味精和味精) 在 System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame 框架) 在 System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame 框架) 在 System.Windows.Threading.Dispatcher.Run() 在 System.Windows.Application.RunDispatcher(对象忽略) 在 System.Windows.Application.RunInternal(窗口窗口) 在 System.Windows.Application.Run(窗口窗口) 在 System.Windows.Application.Run() 在 C:\inetpub\wwwroot\CRM\Cobranca\EmissorBoletosWindows\EmissorBoletosWindows\obj\x86\Debug\App.g.cs:line 0 中的 EmissorBoletosWindows.App.Main() 在 System.AppDomain._nExecuteAssembly(RuntimeAssembly 程序集,字符串 [] 参数) 在 System.AppDomain.ExecuteAssembly(字符串 assemblyFile,证据 assemblySecurity,String [] args) 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ThreadHelper.ThreadStart_Context(对象状态) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态,布尔 ignoreSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态) 在 System.Threading.ThreadHelper.ThreadStart() 内部异常:

【问题讨论】:

我们能得到更多信息吗?就像抛出异常的行周围的代码和/或堆栈跟踪一样?这个“旧 DLL”是什么?它是一个 COM 组件吗?它是用什么语言写的?有源代码吗? 旧的DLL是第三方的,不知道是写什么的。我认为它是一个 COM 组件。 我还注意到,这只发生在 VS 2010 内部运行时。如果我在 Visual Studio 外部运行 .exe,无论我使用什么目标框架(3.5 或 4.0),都不会出现问题。跨度> 【参考方案1】:

如果您检查堆栈顶部,则该方法表明该库正在执行一些软件许可处理。我的猜测(它一个猜测)是该库正在使用可执行文件的名称和路径来定位许可证,并且由于该应用程序正在通过 VSHost 运行,因此失败导致了一个错误作为 COM 异常。

事实上它在 VSHost 之外也能正常工作,这一点很重要。您可以使用诸如FileMon 之类的工具来查看它在哪里出错。

【讨论】:

是的,DLL 加载软件许可文件的这一行。奇怪的是,错误只发生在 VS 2010 + .net 4 内部。如果我更改目标框架或在 VS 2010 之外运行,则不会出现问题。我认为这可能是一些权限问题,所以我给文件夹中的每个人完全信任。 在此之前,我安装了 FileMon,但列出了很多条目,所以我不清楚这可能是什么原因。 @Tony,使用 FileMon 过滤将条目限制在您的应用程序中。【参考方案2】:

目前除了使用 XBAP 之外没有其他解决方案

【讨论】:

以上是关于仅在 VS 2010 上运行时:COMException:灾难性故障:错误代码:-2147418113的主要内容,如果未能解决你的问题,请参考以下文章

为啥 VS 2010 Intellisense 仅在我安装了视觉辅助 X 时才有效?

VS2010上 C++ multimap容器 运行时出错

远程调试脚本代码VS2010

使用TFS 2010在Visual Studio 2012中进行代码审查

仅在VS2017发布时出现角度误差

仅在 VS 调试模式下解决 SQL 查询超时