在ClickOnce更新之后,"...无法访问该文件,因为它正由另一个进程使用"用于程序集

Wal*_*lly 7 c# clickonce

问题描述

我支持WPF ClickOnce部署的应用程序.该应用程序具有通过电子邮件向我报告例外的功能.每次部署后,我通常会得到一个或两个异常报告,如下所示.用户少于100人.

调用堆栈不相同.它总是说,"无法加载文件或程序集.."然后列出像EntityFramework或Unity这样的DLL.它还说,"(HRESULT异常:0x80070020)"

我禁用了自动ClickOnce更新.我正在使用ApplicationDeployment API处理更新.下载更新后,我会显示状态栏消息"重新启动以运行最新版本".然后,用户重新启动应用程序.重新启动应用程序后,"无法访问该文件,因为它正被另一个进程使用"异常发生.通常,如果用户再次重新启动应用程序,则不再发生异常.

另一个开发商所描述的类似的经历在这里.

是什么造成的?

我最初认为,当用户启动新版本时,应用程序的先前版本可能仍在关闭.但是,该应用程序是单实例应用程序.在抛出此异常之前,单实例功能在Main()中实现.这让我相当自信这不是由我的应用程序的两个实例引起的.此外,我的应用程序不直接读取EntityFramework或Unity DLL.

我还有两个假设.

  1. 病毒扫描程序正在锁定ClickOnce刚刚复制的DLL.
  2. ClickOnce更新机制中存在Microsoft错误.

我的问题是,"有谁知道造成这种情况的原因是什么?"

示例调用堆栈#1

这是一个例子:

 System.IO.FileLoadException:
 Could not load file or assembly
 'Microsoft.Practices.Unity, Version=2.1.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
 or one of its dependencies.
 The process cannot access the file because
 it is being used by another process.
 (Exception from HRESULT: 0x80070020)

    at MyNamespace.AppState.RestartTemplateCacheThread(UserOptions userOptions)
    at MyNamespace.AppState.RestartTemplateCacheThread()
    at MyNamespace.MainWindow.hyperlinkReconnect(Object sender, RoutedEventArgs e)

    at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
    at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
    at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
    at System.Windows.ContentElement.RaiseEvent(RoutedEventArgs e)
    at System.Windows.Documents.Hyperlink.OnClick()
    at System.Windows.Documents.Hyperlink.DispatchNavigation(Object sender)
    at System.Windows.Documents.Hyperlink.DoUserInitiatedNavigation(Object sender)
    at System.Windows.Documents.Hyperlink.OnMouseLeftButtonUp(Object sender, MouseButtonEventArgs e)
    at System.Windows.Documents.Hyperlink.OnMouseLeftButtonUp(MouseButtonEventArgs e)
    at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
    at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
    at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
    at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
    at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
    at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
    at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
    at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
    at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
    at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
    at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
    at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
    at System.Windows.ContentElement.RaiseTrustedEvent(RoutedEventArgs args)
    at System.Windows.Input.InputManager.ProcessStagingArea()
    at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
    at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
    at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
    at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
    at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
    at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
    at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
    at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
Run Code Online (Sandbox Code Playgroud)

RestartTemplateCacheThread(...)中的行是......

var ioc = new UnityContainer().LoadConfiguration();
Run Code Online (Sandbox Code Playgroud)

...这可能是第一次访问Unity DLL.

示例调用堆栈#2

在此示例中,Unity DLL已成功加载,但EntityFramework DLL已被锁定.

 System.IO.FileLoadException: 
 Could not load file or assembly
 'EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
 or one of its dependencies.
 The process cannot access the file because it is being used by another process.
 (Exception from HRESULT: 0x80070020)

    at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type)
    at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName)
    at System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark)
    at System.Type.GetType(String typeName)

    at Microsoft.Practices.Unity.Configuration.ConfigurationHelpers.TypeResolverImpl.ResolveAlias(String typeNameOrAlias)
    at Microsoft.Practices.Unity.Configuration.ConfigurationHelpers.TypeResolverImpl.ResolveTypeInternal(String typeNameOrAlias)
    at Microsoft.Practices.Unity.Configuration.ConfigurationHelpers.TypeResolverImpl.ResolveType(String typeNameOrAlias, Boolean throwIfResolveFails)
    at Microsoft.Practices.Unity.Configuration.RegisterElement.GetMappedType()
    at Microsoft.Practices.Unity.Configuration.RegisterElement.ConfigureContainer(IUnityContainer container)
    at Microsoft.Practices.Unity.Configuration.ContainerElement.<>c__DisplayClass1.<ConfigureContainer>b__0(ContainerConfiguringElement element)
    at Microsoft.Practices.ObjectBuilder2.EnumerableExtensions.ForEach[TItem](IEnumerable`1 sequence, Action`1 action)
    at Microsoft.Practices.Unity.Configuration.ContainerElement.ConfigureContainer(IUnityContainer container)
    at Microsoft.Practices.Unity.Configuration.UnityConfigurationSection.Configure(IUnityContainer container, String configuredContainerName)
    at Microsoft.Practices.Unity.Configuration.UnityContainerExtensions.LoadConfiguration(IUnityContainer container, UnityConfigurationSection section, String containerName)
    at Microsoft.Practices.Unity.Configuration.UnityContainerExtensions.LoadConfiguration(IUnityContainer container)

    at MyNamespace.AppState.RestartTemplateCacheThread(UserOptions userOptions)
    at MyNamespace.AppState.SetUserOptions(UserOptions options, Boolean restartBackgroundThreads)
    at MyNamespace.Models.DatasetManager.LoadDataset(String path)
    at MyNamespace.MainWindow.MainWindow_Loaded(Object sender, RoutedEventArgs args)

    at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
    at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
    at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
    at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
    at System.Windows.BroadcastEventHelper.BroadcastEvent(DependencyObject root, RoutedEvent routedEvent)
    at System.Windows.BroadcastEventHelper.BroadcastLoadedEvent(Object root)
    at MS.Internal.LoadedOrUnloadedOperation.DoWork()
    at System.Windows.Media.MediaContext.FireLoadedPendingCallbacks()
    at System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks()
    at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)
    at System.Windows.Media.MediaContext.AnimatedRenderMessageHandler(Object resizedCompositionTarget)
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
    at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
Run Code Online (Sandbox Code Playgroud)