簡體   English   中英

ConfigurationManager.OpenMappedExeConfiguration“因為它正被另一個進程使用”

[英]ConfigurationManager.OpenMappedExeConfiguration "because it is being used by another process"

當用戶修改它時,我想重新閱讀 MySolution.main.config(我的 app.config)感謝 FileSystemWatcher。 我構建了一個名為 FileWatcher 的包裝器。

使用這段代碼捕獲 OnChanged 事件

    var map = new ExeConfigurationFileMap { ExeConfigFilename = _appConfigFilePath };
    var config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);

引發此異常

System.Configuration.ConfigurationErrorsException HResult=0x80131902 Message=加載配置文件時出錯:進程無法訪問文件 'C:\Source\Solutions\MySolution_1.2.3\MySolution\bin\Debug\MySolution.main.config' 因為它正在被另一個進程使用。 (C:\Source\Solutions\MySolution_1.2.3\MySolution\bin\Debug\MySolution.main.config) Source=System.Configuration.ConfigurationManager StackTrace: at System.Configuration.ConfigurationSchemaErrors.ThrowIfErrors(Boolean ignoreLocal) 在//src/ libraries/System.Configuration.ConfigurationManager/src/System/Configuration/ConfigurationSchemaErrors.cs:line 71 at System.Configuration.BaseConfigurationRecord.ThrowIfParseErrors(ConfigurationSchemaErrors schemaErrors) 在 / /src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration /BaseConfigurationRecord.cs: System.Configuration.Configuration..ctor(String locationSubPath, Type typeConfigHost, Object[] hostInitConfigurationParams) 在 / /src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/Configuration.cs中的 3634 行: System.Configuration.ClientConfigurationHost.OpenExeConfiguration(ConfigurationFileMap fileMap, Boolean isMachine, ConfigurationUserLevel userLevel, String exePath) 中的第 75 行 / /src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/ClientConfigurationHost.cs:line 485 at System.Configuration.ConfigurationManager.OpenExeConfigurationImpl(ConfigurationFileMap fileMap, Boolean isMachine, ConfigurationUserLevel userLevel, String exePath, Boolean preLoad) 在/ /src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/ConfigurationManager.cs:line 214 at System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(ExeConfigurationFileMap fileMap, ConfigurationUserLevel userLevel) / /src/libraries/System.Configuration.ConfigurationManager /src/System/Configuration/ConfigurationManager.cs: C 中的 Siav.MySolution.Log.ConfigurationUtil.FileWatcher.OnChanged(Object sender, FileSystemEventArgs e) 第 192 行:\Source\Solutions\MySolution_1.2.3\Siav.MySolution.Log\ ConfigurationUtil\FileWatcher.cs:第 60 行位於 System.IO.FileSystemWatcher.OnChanged(FileSystemEventArgs e) 在 f:\dd\ NDP\fx\src\services\io\system\io\FileSystemWatcher.cs:line 822 at System.IO.FileSystemWatcher.NotifyFileSystemEventArgs(Int32 action, String name) in f:\dd\NDP\fx\src\services\io \system\io\FileSystemWatcher.cs:第 773 行
在 System.IO.FileSystemWatcher.CompletionStatusChanged(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* overpedPointer) 在 f:\dd\NDP\fx\src\services\io\system\io\FileSystemWatcher.cs:line 594
在 System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP) 在 f:\dd\ndp\clr\src\BCL\system\threading\overlapped.cs:line 121

此異常最初是在此調用堆棧中引發的:System.IO.__Error.WinIOError(int, string) in __error.cs System.IO.FileStream.Init(string, System.IO.FileMode, System.IO.FileAccess, int, bool, System.IO.FileShare, int, System.IO.FileOptions, Microsoft.Win32.Win32Native.SECURITY_ATTRIBUTES, string, bool, bool, bool) 在filestream.cs System.IO.FileStream.FileStream(string, System.88224488260 FileMode, System.IO.FileAccess, System.IO.FileShare) 在 filestream.cs 中InternalConfigHost.cs 中的 OpenStreamForRead(string) ClientConfigurationHost.cs 中的 System.Configuration.ClientConfigurationHost.OpenStreamForRead(string) ) 在 UpdateConfigHost.cs 中 System.Configuration.ImplicitMachineConfigHost.OpenStreamForRead(string) 在 ImplicitMachineConfigHost.cs 中

內部異常 1:IOException:進程無法訪問文件“C:\Source\Solutions\MySolution_1.2.3\MySolution\bin\Debug\MySolution.main.config”,因為它正被另一個進程使用。

我試過一個簡單的鎖,它不起作用。

這是我的包裝器的構造函數

    public FileWatcher(string appConfigFilePath)
    {
        _appConfigFilePath = appConfigFilePath;


        _lastRead = DateTime.MinValue;

        var watcher = new FileSystemWatcher(Path.GetDirectoryName(_appConfigFilePath))
        {
            Filter = Path.GetFileName(_appConfigFilePath),
            NotifyFilter = NotifyFilters.LastWrite,

            EnableRaisingEvents = true
        };

        watcher.Changed += OnChanged;
        watcher.Error += OnError;
    }

有什么建議么?

謝謝

我不得不像 log.net 那樣重試訪問該文件。 我建議你也這樣做(github 上有 log.net 源代碼)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM