![](/img/trans.png)
[英]ConfigurationManager.OpenMappedExeConfiguration problematic behaviour
[英]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.