2009-07-05 11 views
30

Dodałem wiele plików app.config (każdy z inną nazwą) do projektu i ustawiłem je tak, aby były kopiowane do katalogu wyjściowego każdej kompilacji.ConfigurationManager.OpenExeConfiguration - ładuje zły plik?

Staram i dostęp do zawartości każdego pliku przy użyciu to:

System.Configuration.Configuration o = ConfigurationManager.OpenExeConfiguration(@"app1.config"); 

Kod działa, ale o.HasFile kończy się fałsz i o.FilePath kończy się „app1.config.config”. Jeśli zmienię do kodu:

System.Configuration.Configuration o = ConfigurationManager.OpenExeConfiguration(@"app1"); 

Następnie bomby kod z „Wystąpił błąd ładowania pliku konfiguracyjnego: Parametr«exePath»jest nieprawidłowa nazwa parametru. ExePath”.

Jeśli skopiuję/wklejam plik konfiguracyjny (więc kończę z app1.config i app1.config.config), to kod działa dobrze, jednak założę, że to nie jest dobre rozwiązanie. Moje pytanie brzmi: w jaki sposób mogę użyć ConfigurationManager.OpenExeConfiguration, aby załadować plik konfiguracyjny poprawnie?

Odpowiedz

21

Zgodnie z http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/3943ec30-8be5-4f12-9667-3b812f711fc9 parametr jest lokalizacją exe, a metoda następnie szuka konfiguracji odpowiadającej temu exe (domyślam się, że nazwa parametru exePath ma teraz sens!).

+4

Pamiętaj, że możesz przekazać dowolną ścieżkę do zespołu, a nie tylko exe. Podajesz "SomeLib.dll", otworzy się "SomeLib.dll.config". Jest to przydatne, gdy projekt .NET jest tak naprawdę wtyczką do innej aplikacji, dla której nie chcesz wdrażać pliku .config obok jego pliku wykonywalnego. – Ludovic

+0

Jednak kiedy umieściłem plik o nazwie app.config w katalogu biblioteki dll, używając "app" jako parametru exePath, musiałem zmienić nazwę pliku do aplikacji, zanim zadziałało ... – tobbenb3

7

Aby uniknąć tego problemu całkowicie, można przeczytać w pliku konfiguracyjnym jako plik XML, na przykład:

using System.Xml; 
using System.Xml.XPath;  

XmlDocument doc = new XmlDocument(); 
doc.Load(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\..\\..\\..\\MyWebProject\\web.config"); 
string value = doc.DocumentElement.SelectSingleNode("/configuration/appSettings/add[@key='MyKeyName']").Attributes["value"].Value; 
+0

Dzięki za XPath droga. Używam ConfigurationManager przez około dwa dni teraz z Configuration.AppSettings.Settings.Count = 0. Twoja metoda co najmniej ustawia poprawną wartość dla mnie. – TamusJRoyce

+1

Zdecydowanie dobre obejście :) – ykatchou

2
using System.Reflection; 

try 
{ 
    Uri UriAssemblyFolder = new Uri(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase)); 
    string appPath = UriAssemblyFolder.LocalPath; 

    //Open the configuration file and retrieve 
    //the connectionStrings section. 
    Configuration config = ConfigurationManager. 
     OpenExeConfiguration(appPath + @"\" + exeConfigName); 

    ConnectionStringsSection section = 
     config.GetSection("connectionStrings") 
     as ConnectionStringsSection; 
} 

Przynajmniej jest to metoda używam podczas szyfrowania i deszyfrowania connectionStrings sekcja dla moich aplikacji konsoli/GUI. exeConfigName to nazwa pliku wykonywalnego, w tym .exe.

44

nie pamiętam gdzie znalazłem to rozwiązanie, ale tutaj jest to, jak udało mi się załadować konkretny plik konfiguracyjny exe:

ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = "EXECONFIG_PATH" }; 
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None); 
+1

To działa! Crazy, że to tyle pracy, aby dowiedzieć się, jak po prostu przeczytać kiepski plik konfiguracyjny z określonej dokładnej ścieżki, ale dzięki. – neminem

+1

Jak korzystać z wynikowych 'config.AppSettings [" somekey "]' (lub 'config.AppSettings.Settings []') bez błędów uprawnień dostępu? –

+1

@Rubistro należy sprawdzić, czy element istnieje (w przeciwnym razie config.AppSettings ["somekey"] zwróci wartość null), a następnie użyć .Value – Jedidja