pojedyncza aplikacja.config multi-project c#

Chcę korzystać z jednej aplikacji.config przez 3 różne projekty.

Jak uzyskać dostęp do konfiguracji?

ConfigurationManager.AppSettings["config1"]
 35
Author: ala, 2009-09-01

7 answers

Powiedzmy, że masz taką strukturę katalogów:

  • rozwiązanie
    • Project1
    • Project2
    • Project3

Zrób to:

  1. Utwórz aplikację.plik konfiguracyjny w folderze poziomu rozwiązania. Nie znajdziesz opcji dodania aplikacji.plik konfiguracyjny z szablonów, więc po prostu utwórz nowy pusty plik tekstowy z nazwą aplikacji.config i wklej zawartość zwykłej aplikacji.plik konfiguracyjny.
  2. Dla każdego projektu w rozwiązaniu "Explorer": {]}

    1. Kliknij prawym przyciskiem myszy i wybierz Add > Existing Item
    2. zlokalizuj plik
    3. Wybierz Add as link z listy rozwijanej obok przycisku Add.

      Dodaj jako link

Edited to add:

Poprawnie stwierdzasz, że powyższa metoda udostępniła tylko plik do czasu kompilacji. Aby użyć udostępnionego pliku w czasie wykonywania, zobacz odpowiedzi na to pytanie.

 44
Author: Jon Grant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:44

Wspólny plik konfiguracyjny

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section 
            name="appSettings" 
            type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
            />
    </configSections>
    <appSettings>
        <add key="key1" value="value1"/>
    </appSettings>
</configuration>

Aby uzyskać dostęp do zmapowanego pliku konfiguracyjnego

ConfigurationFileMap fileMap = new ConfigurationFileMap(file); //Path to your config file
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
string value = configuration.AppSettings.Settings["key1"].Value;
 15
Author: ala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-01 08:49:03

Oto okno dialogowe "Dodaj istniejący element" W VS 2008:

Okno dodawania istniejącego elementu http://i27.tinypic.com/72bwo6.jpg

Kliknij mały wskaźnik rozwijany na przycisku " Dodaj "i wybierz" Dodaj jako Link " z menu kontekstowego.

Marc

 7
Author: marc_s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-01 12:20:48

Znalazłem przycisk i otworzyłem aplikacja.config jako link, jednak że spowodowane po zbudowaniu ponownie utworzyć osobny plik konfiguracyjny dla każdego projektu, i dlatego, podczas wdrażania 3 projekt, będę miał 3 pliki config. To, co chciałem zrobić, to utrzymać jeden plik dla wszystkich projektów w pewne rozwiązanie. Mogę to zrobić?

Tak-ty możesz to zrobić, ale powinieneś to zrobić?

Podstawowe założenie w aplikacji. Net jest takie, że jedna aplikacja = jeden plik konfiguracyjny. Po wyjęciu z pudełka i dzięki prostej metodzie nie można udostępniać plików konfiguracyjnych między aplikacjami.

Jeśli utworzysz własne sekcje konfiguracyjne, możesz "zlecić" je zewnętrznym plikom, które mogą być udostępniane. Wyobraź sobie, że tworzysz własną sekcję konfiguracyjną o nazwie "MyConfiguration", a następnie swoją aplikację.config wyglądałby mniej więcej tak:

<configuration>
  <configSections>
    <section name="MyConfiguration" 
             type="MyConfigurationSection, MyConfigurationAssembly" />
  </configSections>

  <MyConfiguration>
    <nestedElement>
      <dateTimeValue>10/16/2006</dateTimeValue>
      <integerValue>1</integerValue>
    </nestedElement>
  </MyConfiguration>
</configuration>

Możesz mieć sekcję "MyConfiguration" we własnym pliku i odwoływać się do niej z aplikacji config:

<configuration>
  <configSections>
    <section name="MyConfiguration" 
             type="MyConfigurationSection, MyConfigurationAssembly" />
  </configSections>

  <MyConfiguration configSource="MyConfiguration.config" />
</configuration>

I twoje " MyConfiguration.config " będzie zawierał:

  <MyConfiguration> 
    <nestedElement>
      <dateTimeValue>10/16/2006</dateTimeValue>
      <integerValue>1</integerValue>
    </nestedElement>
  </MyConfiguration>

W ten sposób możesz "uzewnętrznić" i tym samym udostępnić co najmniej większość ustawień konfiguracyjnych-pod warunkiem, że są one w twoich własnych niestandardowych sekcjach konfiguracyjnych.

Aby uzyskać więcej informacji i doskonałe wprowadzenie do tajemnic konfiguracji. NET 2.0 i nowszych, zobacz trzyczęściową serię Jona Risty na temat konfiguracji. NET 2.0 w CodeProject.

Gorąco polecam, dobrze napisane i niezwykle pomocne!

Marc

 7
Author: marc_s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-01 08:51:26

Jedną z opcji projektowania jest unikanie dostępu do aplikacji.konfigurację bezpośrednio z projektów biblioteki klas, unikając w ten sposób dodatkowej zależności zewnętrznej.

Raczej tylko twój projekt wykonywalny wie o pliku konfiguracyjnym i może jawnie przekazać odpowiednie informacje konfiguracyjne do bibliotek, gdy tworzy z nich obiekty lub je inicjalizuje.

 6
Author: Greg D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-01 11:40:50

Rozumiem, że to stare pytanie, ale jest o wiele łatwiejszy sposób na osiągnięcie tego. Jeśli używasz programu Visual Studio 2008 lub nowszego, istnieje Typ projektu o nazwie "Projekt współdzielony".

VS2015 C # Shared Project

Wspólny Projekt może zawierać praktycznie wszystko, co mogą zawierać inne typy projektów. Dotyczy to nie tylko C#, ale wszystkich języków obsługiwanych przez VS2015. Gdy coś jest zawarte we współdzielonym projekcie, jest ono dostępne dla innych projektów po dodaniu odniesienia do it (patrz niżej).

Zasadnicza różnica pomiędzy klasami w projekcie współdzielonym a biblioteką współdzieloną polega na tym, że gdy skompilujesz program, wszystko, co znajduje się w projekcie współdzielonym, zostanie skompilowane bezpośrednio do twojego projektu, a nie jako osobny plik (.dll, .exe). Pomyśl o tym tak, jakby wszystko, co znajduje się we wspólnym projekcie, było wstawiane do innych projektów. Oto mały samouczek na temat konfigurowania tego i korzystania z niego:

Visual Studio 2015 - Wspólny Projekt Tutorial:

Utwórz nowy Współdzielony projekt wybierając File - > New - > Project lub klikając prawym przyciskiem myszy rozwiązanie w Eksploratorze rozwiązań i wybierając Add->New Project. Gdy pojawi się okno dialogowe wybierz "współdzielony projekt", nadaj projektowi nazwę TestShared w tym przykładzie.

Dodaj Współdzielony Projekt

Po dodaniu nowego projektu możesz dodać wszystko, czego potrzebujesz, aby być dostępnym dla innych projektów. W takim przypadku dodamy aplikację.config. Kliknij prawym przyciskiem myszy na udostępnionym projekcie i wybierz Dodaj - > nowy Pozycja . Wybierz Visual C# - > Data- > plik XML nazywając go oczywiście app.config.

app.config

Na koniec dodaj odniesienie do udostępnionego projektu, klikając prawym przyciskiem myszy projekt, z którym chcesz udostępnić projekt, i wybierz Dodaj - > odniesienie. W oknie dialogowym Menedżer odniesień wybierz współdzielony projekt, który zostanie wyświetlony pod pozycją "współdzielone projekty" po lewej stronie.

Dodaj Referencję

Teraz wszystko, co znajduje się we współdzielonym projekcie, jest dostępne w innym projekt, nie ma potrzeby robić żadnych przy użyciu importu lub coś w tym stylu. To po prostu działa. Ten wzór jest bardzo przydatny, gdy opracowujesz program i musisz mieć kilka różnych GUI (Windows, iOS, Android itp.). Na przykład możesz mieć jeden wspólny projekt dla" podstawowej " funkcjonalności, a następnie osobny projekt GUI dla każdego z różnych systemów operacyjnych, które chcesz obsługiwać w swoim programie.

Zdaję sobie sprawę, że to jest starsze pytanie, ale skoro pojawiło się to w Google myślałem, że odpowiem na to, więc gdy inni szukają tego samego, co wiedzą o tej bardzo potężnej funkcji VS.

 4
Author: Andy Braham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-10 15:47:08
System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config = ConfigurationManager.OpenExeConfiguration(Path.Combine(@"D:\", "config.exe"));
foreach (string key in config.AppSettings.Settings.AllKeys)
{
   string value = config.AppSettings.Settings[key].Value;
   ConfigurationManager.AppSettings.Set(key, value);
}
 1
Author: Kapil dev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-20 07:46:27