2011-01-03 6 views
27

Tworzę aplikację konsolową w Visual Studio 2010 za pomocą C#. Chcę, aby ta aplikacja była samodzielna, ponieważ potrzebujesz tylko exe i możesz ją uruchomić z dowolnego miejsca. Chcę również użyć app.config do przechowywania ciągów połączeń i tak dalej.Jak skompilować mój App.config do mojego exe w aplikacji C# konsoli VS2010?

Moim problemem jest to, że nie może wydawać się, aby dowiedzieć się, jak to, że dane app.config do skompilowanego EXE. Widzę, że tworzy appname.exe.config, ale nie chcę, aby ludzie martwili się o zgrywanie dwóch oddzielnych plików, gdy dostaną aplikację.

Żadne z googlowań, które zrobiłem, nie wymyśliło niczego. Czy to możliwe?

+0

AFAIK nie ma możliwości włączenia pliku konfiguracyjnego do pliku exe.Jeśli konfiguracja jest prosta, możesz po prostu zapisać ją w pliku własnym i utworzyć ten plik przy pierwszym uruchomieniu z ustawieniami domyślnymi. Inną opcją jest również rejestr systemu Windows, ale wtedy trzeba uruchomić podniesiony w Vista lub wyżej (co samo w sobie nie jest trudne) – gideon

+2

możliwy duplikat [Plik konfiguracyjny jako Osadzone zasoby] (http://stackoverflow.com/questions/462583/configuration-file-as-embedded-resource) –

+1

Pomyślcie o tym przez chwilę. Gdyby było to możliwe, Twój użytkownik nie mógł już zmienić ciągu połączenia. Pokonanie punktu posiadania jednego. Pojedynczy plik nigdy nie stanowi problemu, nazywa się to setup.exe –

Odpowiedz

13

nie można. Połowa punktu takich plików konfiguracyjnych to umożliwienie zmian w konfiguracji aplikacji poza samą aplikacją.

Po prostu trzeba zmodyfikować program tak, aby nie był zależny od pliku konfiguracyjnego aplikacji - najłatwiej byłoby po prostu wstawić wartości z twojej konfiguracji do globalnych zmiennych tylko do odczytu.

+0

Chyba przegapiłem punkt plików konfiguracyjnych. Będę musiał je mocno ustawić. – Patches

+8

Podczas gdy +1, problem polega na tym, gdy narzędzie umieszcza coś w app.config, a nie w tobie (np. Po dodaniu odwołania do usługi internetowej). Użytkownik absolutnie nie powinien tego dotykać, a mimo to musi zostać wysłany w osobnym pliku. Głupota bonusowa: Zwykłe ustawienia aplikacji, w tym ciągi połączeń, zostają osadzone w exe - możesz wysłać plik exe sam i połączy się z bazą danych. Ale ustawienia dla referencji usług internetowych nie są osadzane, a gdy tylko odwołasz się do nich, musisz rozpowszechniać '.config'. To jest po prostu głupie. – GSerg

+7

Gorzej, gdy jedynym powodem, dla którego potrzebujesz pliku app.config, jest upewnienie się, że Twój program nie chce uruchamiać programu .NET 4.0 - ponieważ z jakiegoś powodu firma Microsoft nie mogła oznaczyć wymagania 4.5.2 w samym zestawie ... –

3

Generalnie nie chcesz to zrobić jak twój app.config zapewnia mechanizm, dzięki któremu konfiguracja może być wykonane w czasie wykonywania. O ile jest to konkretny cel (zachowując konfigurację poza kodzie, ale to śledzić binarny), masz kilka opcji:

  • Dynamicznie utworzyć plik konfiguracyjny
  • zapisać ustawienia w rejestrze
  • zapisać ustawienia jako ciągi zasobów w aplikacji konsoli

Jestem pewien, że istnieją inne, bardziej twórcze, dostępnych opcji. Moje zalecenie dotyczyłoby drugiej opcji. Po uruchomieniu aplikacji utwórz niezbędne klucze i ustaw ich wartości domyślne z pliku wykonywalnego. W ten sposób, jeśli będziesz potrzebować debugowania w późniejszym terminie, możesz po prostu uruchomić regedit i dokonać niezbędnych zmian bez rekompilacji.

+0

Chciałem, żeby to było całkowicie niezależne, więc myślę, że zostanę w rejestrze sam. Wygląda na to, że twoja opcja 3 jest najlepsza dla moich celów. – Patches

5

Masz na myśli, że musisz dodać go do exe jako zasób? Po pierwsze, nie możesz, app.config jest oparty na plikach, a nie na zasobach.

Z drugiej strony, jedynym punktem pliku konfiguracyjnego jest to, że można go zmienić. W przeciwnym razie wystarczy stały kod lub stałe.

8

Widzę, dokąd zmierzasz, ale odpowiedź może być nieco bardziej skomplikowana, niż oczekiwałeś.

  1. Producent app.config być osadzony zasób.
  2. Ręcznie przeanalizować app.config dostać domyślne ustawienia aplikacji ciągi/połączeń/etc
  3. nadal wyglądają na app.config i zastępują domyślne przeczytać w wcześniej z app.config wartości

W ten sposób masz kilka rozsądnych wartości domyślnych, że nie musisz utrzymywać osobno od siebie app.config jako stałych, możesz uruchomić aplikację jako tylko exe, a wciąż możesz ją modyfikować w środowisku wykonawczym, dodając ją ponownie w aplikacji. config.

Należy pamiętać, że czytanie w app.config z zasobu nie daje takiego samego zachowania, jak normalne app.config. Zasadniczo czytasz go i używasz ręcznie.

+1

Ug, tak, pomysł tutaj ułatwia sprawę, a nie jest trudniejszy. Wygląda na to, że lepiej będzie, jeśli po prostu ustawiam obiekt ustawień w moim kodzie. – Patches

3

Jak podkreślali inni, ideą pliku konfiguracyjnego jest unikanie zakodowanych wartości.

Alternatywą jest napisanie sekcji konfiguracji niestandardowej, gdzie każdy element jest opcjonalny i ma wartości domyślne. W ten sposób każdy, kto może uzyskać z domyślnymi wartościami, nie potrzebuje pliku konfiguracyjnego. Ale jeśli muszą zastąpić wartość domyślną, mogą ją zapewnić.

(Niestety, tylko trochę burzy mózgów. Nie mam przykład dostępne).

+6

Niestety Microsoft (ab) użył tego pliku do celów innych niż konfiguracja. Mianowicie, służy do wymuszania odrzucenia aplikacji .NET 4.5 na starszą wersję .NET. Bas-ackwards, aby umożliwić konfigurację przez użytkownika (przy jednoczesnym uniemożliwieniu korzystania z pojedynczych aplikacji), nieprawdaż? –

3

jak ludzie mówią o cały punkt pliku konfiguracyjnym jest zmodyfikowanie niektórych ustawień poza aplikacją. Możesz kodować lub używać stałych, ale możesz także użyć rejestru w oknach, jeśli chcesz. W ten sposób możesz wprowadzać zmiany w aplikacji i nadal mieć tylko jeden plik exe.

Projekt kodu zawiera dobre informacje na temat odczytu, zapisu i usuwania z rejestru. http://www.codeproject.com/KB/system/modifyregistry.aspx Należy jednak zachować ostrożność podczas edytowania rejestru. Wiele aplikacji zależy od tego, więc możesz zniszczyć niektóre ustawienia, jeśli zrobisz coś źle. Polecam czytać, a następnie robić.

public string Read(string KeyName) { 
RegistryKey rk = baseRegistryKey; 
// Open a subKey as read-only 

RegistryKey sk1 = rk.OpenSubKey(subKey); 
// If the RegistrySubKey doesn't exist -> (null) 

if (sk1 == null) 
{ 
    return null; 
} 
else 
{ 
    try 
    { 
     // If the RegistryKey exists I get its value 
     // or null is returned. 
     return (string)sk1.GetValue(KeyName.ToUpper()); 
    } 
    catch (Exception e) 
    { 
     // AAAAAAAAAAARGH, an error! 
     ShowErrorMessage(e, "Reading registry " + KeyName.ToUpper()); 
     return null; 
    } 
    } 
} 

public bool Write(string KeyName, object Value) { 
    try 
    { 
     // Setting 
     RegistryKey rk = baseRegistryKey ; 
     // I have to use CreateSubKey 
     // (create or open it if already exits), 
     // 'cause OpenSubKey open a subKey as read-only 
     RegistryKey sk1 = rk.CreateSubKey(subKey); 
     // Save the value 
     sk1.SetValue(KeyName.ToUpper(), Value); 
     return true; 
    } 
    catch (Exception e) { 
     // AAAAAAAAAAARGH, an error! 
     ShowErrorMessage(e, "Writing registry " + KeyName.ToUpper()); 
     return false; 
    } 
    }  

public bool DeleteKey(string KeyName) { 
    try 
    { 
     // Setting 
     RegistryKey rk = baseRegistryKey ; 
     RegistryKey sk1 = rk.CreateSubKey(subKey); 
     // If the RegistrySubKey doesn't exists -> (true) 
     if (sk1 == null) 
      return true; 
     else 
      sk1.DeleteValue(KeyName); 
     return true; 
    } 
    catch (Exception e) 
    { 
     // AAAAAAAAAAARGH, an error! 
     ShowErrorMessage(e, "Deleting SubKey " + subKey); 
     return false; 
    } 
} 

Oczywiście działa to tylko w systemie Windows. Zakładam, że używasz programu Visual Studio, więc prawdopodobnie używasz systemu Windows.

Szczęśliwe kodowanie i powodzenia!

1

IL Merge ma problem z plikiem wykonywalnym wpf również wolno. Skończyło się na użyciu Cosura.Fody https://github.com/Fody/Costura i za pomocą parametru wiersza polecenia do przekazywania mojej wartości konfiguracyjnej aplikacji. Również użycie iexpress http://en.wikipedia.org/wiki/IExpress do utworzenia końcowego pliku wykonywalnego z argumentami wiersza poleceń i exe połączonymi razem

3

Najlepszym sposobem obejścia tego problemu jest utworzenie go samodzielnie podczas uruchamiania aplikacji.

  1. Dodaj app.config jako zasób, zmień go na "App_Config"
  2. Sprawdź, czy plik konfiguracyjny istnieje
  3. Jeśli nie, pisać domyślny plik .config

Przykład kodu:

Program.cs

[STAThread] 
    static void Main() 
    { 
     CreateConfigIfNotExists(); 
    } 

    private static void CreateConfigIfNotExists() 
    { 
     string configFile = string.Format("{0}.config", Application.ExecutablePath); 

     if (!File.Exists(configFile)) 
     { 
      File.WriteAllText(configFile, Resources.App_Config); 
     } 
    } 

Pamiętaj, że będzie zapisywać tylko bieżącą konfigurację podczas budowania. Nie zaktualizuje go automatycznie po wdrożeniu nowej wersji. Będzie zawierał konfigurację taką jaka jest podczas budowania. Ale to może wystarczyć :)

+0

Ładne rozwiązanie do niektórych zastosowań. Jednak często instalator działa z prawami administratora i może instalować w C: \ Program Files. Sama aplikacja działa bez uprawnień administratora, więc nie może pisać do folderu, w którym jest zainstalowany program EXE (na przykład w C: \ Program Files). – George

-2

Weźmy na przykład aplikację WinForm, podczas kompilacji zostanie wygenerowany plik 'xxx.EXE.config' wraz z wyjściowym plikiem EXE. Będzie zawierał ustawienia "app.config". Rozprowadź to także.

+1

-1 - Właśnie tego starałem się uniknąć. Jak uniknąć tego, było całe moje pytanie.Powiedziałem nawet - "widzę, że tworzy appname.exe.config, ale nie chcę, aby ludzie martwili się o zgrywanie dwóch oddzielnych plików ..." – Patches