Ich erstelle eine Anwendung in .NET 4, die die Konfiguration der Anwendung während der Laufzeit der Anwendung aktualisieren muss. Der Code, der dies tut, lautet wie folgt:
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings["MySetting"].Value = "mein Wert";
config.Save();
Meine App.Config sieht so aus...
Wenn ich diese Anwendung auf einem lokalen Laufwerk ausführe (und daher die Konfigurationsdatei auch auf dem lokalen Laufwerk liegt, wenn das Programm ausgeführt wird), funktioniert dieser Code. Wenn die Anwendung jedoch mit der Konfigurationsdatei auf einem Netzwerklaufwerk (tatsächlich Z:) ausgeführt wird, schlägt der Code mit der folgenden Ausnahme in der Zeile config.Save();
fehl...
System.InvalidOperationException wurde nicht behandelt
Nachricht=Die Methode wurde mit dem unerwarteten Fehlercode 1 beendet.
Quelle=mscorlib
StackTrace:
at System.Security.AccessControl.NativeObjectSecurity.CreateInternal(ResourceType resourceType, Boolean isContainer, String name, SafeHandle handle, AccessControlSections includeSections, Boolean createByName, ExceptionFromErrorCode exceptionFromErrorCode, Object exceptionContext)
at System.Security.AccessControl.FileSystemSecurity..ctor(Boolean isContainer, String name, AccessControlSections includeSections, Boolean isDirectory)
at System.Security.AccessControl.FileSecurity..ctor(String fileName, AccessControlSections includeSections)
at System.Configuration.Internal.WriteFileContext.DuplicateTemplateAttributes(String source, String destination)
at System.Configuration.Internal.WriteFileContext.DuplicateFileAttributes(String source, String destination)
at System.Configuration.Internal.WriteFileContext.Complete(String filename, Boolean success)
at System.Configuration.Internal.InternalConfigHost.StaticWriteCompleted(String streamName, Boolean success, Object writeContext, Boolean assertPermissions)
at System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext, Boolean assertPermissions)
at System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext)
at System.Configuration.Internal.DelegatingConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext)
at System.Configuration.UpdateConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext)
at System.Configuration.MgmtConfigurationRecord.SaveAs(String filename, ConfigurationSaveMode saveMode, Boolean forceUpdateAll)
at System.Configuration.Configuration.SaveAsImpl(String filename, ConfigurationSaveMode saveMode, Boolean forceSaveAll)
at System.Configuration.Configuration.Save()
at MyProj.Program.Main() in Z:\\repos\\project\\MyProj\\Program.cs:line 61
at System.AppDomain.\_nExecuteAssembly(RuntimeAssembly assembly, String\[\] args)
at System.AppDomain.nExecuteAssembly(RuntimeAssembly assembly, String\[\] args)
at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)
at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()
at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String\[\] activationCustomData)
at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)
at System.Activator.CreateInstance(ActivationContext activationContext)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
at System.Threading.ThreadHelper.ThreadStart\_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
Ich denke, dass dies ein Sicherheitsproblem mit .NET ist, bin mir aber nicht sicher, wie ich diese Sicherheit deaktivieren könnte.
Das Netzwerklaufwerk, auf dem die Konfigurationsdatei gespeichert ist, ist tatsächlich ein VirtualBox-Freigabelaufwerk. Das Host-System ist Linux und das freigegebene Laufwerk ist auf ein Ext4-Dateisystem gemappt.
Ich glaube nicht, dass es sich hierbei einfach um ein Dateisystem-Schreibproblem handelt, da ich erfolgreich in eine Textdatei im selben Verzeichnis wie meine App.config-Datei schreiben kann (zumindest glaube ich, dass es das gleiche Verzeichnis ist, es sei denn, .NET macht etwas hinter den Kulissen wie die Verwendung eines temporären Verzeichnisses).
File.WriteAllText("Text.txt", "Testen");