wake-up-neo.com

Wie kompiliere ich meine App.config mit einer VS2010 C # -Konsolen-App in meinem Exe?

Ich erstelle in Visual Studio 2010 eine Konsolenanwendung mit c #. Ich möchte, dass diese App für sich alleine steht. Alles was Sie brauchen, ist das Exe, und Sie können es von überall aus ausführen. Ich möchte auch app.config verwenden, um Verbindungszeichenfolgen usw. zu speichern. 

Mein Problem ist, dass ich scheinbar nicht herausfinden kann, wie diese app.config-Daten in die kompilierte Exe eingefügt werden. Ich sehe, dass es appname.exe.config erstellt, aber ich möchte nicht, dass sich die Leute Sorgen machen müssen, wenn sie sich zwei separate Dateien holen, wenn sie die App bekommen. 

Nichts von dem Googeln, das ich gemacht habe, ist mit irgendetwas gekommen. Ist das überhaupt möglich?

29
Patches

Du kannst nicht Der halbe Punkt solcher Konfigurationsdateien besteht darin, Änderungen an der Konfiguration der App außerhalb der App selbst zuzulassen.

Sie müssten einfach Ihr Programm so ändern, dass es keine Abhängigkeit von der App-Konfigurationsdatei hat. Die einfachste Möglichkeit wäre, die Werte in Ihrer Konfiguration in schreibgeschützte globale Variablen einzufügen.

12
Billy ONeal

Ich kann sehen, wohin Sie damit gehen, aber die Antwort könnte etwas komplizierter sein, als Sie gesucht haben.

  1. Machen Sie app.config zu einer eingebetteten Ressource.
  2. Analysieren Sie die app.config manuell, um default App-Einstellungen/Verbindungszeichenfolgen/etc zu erhalten
  3. Suchen Sie immer noch nach einer app.config und überschreiben Sie die zuvor eingelesenen Standardwerte mit den Werten von app.config

Auf diese Weise haben Sie einige vernünftige Standardwerte, die Sie nicht separat von Ihrer app.config als Konstanten verwalten müssen. Sie können Ihre App nur als Exe ausführen. Sie können sie jedoch zur Laufzeit ändern, indem Sie sie in der app.config hinzufügen .

Denken Sie daran, dass das Lesen der app.config aus einer Ressource nicht dasselbe Verhalten wie die normale app.config ergibt. Sie lesen es im Grunde und verwenden es von Hand.

9
Alan Jackson

Sie meinen, Sie müssen es als Ressource zum Exe hinzufügen? Zunächst einmal können Sie nicht, dass app.config dateibasiert ist und nicht auf Ressourcen basiert.

Andererseits ist der einzige Punkt der Konfigurationsdatei, dass Sie sie ändern können. Ansonsten einfach Hard-Code oder Konstanten verwenden.

5
Aliostad

Im Allgemeinen möchten Sie dies nicht tun, da Ihre app.config einen Mechanismus bietet, mit dem die Konfiguration zur Laufzeit vorgenommen werden kann. Soweit Sie ein bestimmtes Ziel verfolgen (Konfiguration außerhalb Ihres Codes beibehalten, aber der Binärdatei folgen lassen), haben Sie mehrere Möglichkeiten:

  • Erstellen Sie dynamisch eine Konfigurationsdatei
  • Speichern Sie die Einstellungen in der Registrierung
  • Speichern Sie die Einstellungen als Ressourcenzeichenfolgen in der Konsolenanwendung

Ich bin mir sicher, dass es noch andere, kreativere Optionen gibt. Meine Empfehlung wäre für die zweite Option. Erstellen Sie beim ersten Start der Anwendung die erforderlichen Schlüssel und legen Sie ihre Standardwerte aus der ausführbaren Datei fest. Auf diese Weise können Sie, wenn Sie zu einem späteren Zeitpunkt ein Debugging durchführen müssen, einfach regedit ausführen und die erforderlichen Änderungen vornehmen, ohne erneut zu kompilieren.

3
Bobby D

Wie bereits erwähnt, besteht die Idee hinter einer Konfigurationsdatei darin, hart codierte Werte zu vermeiden.

Als Alternative können Sie einen benutzerdefinierten Konfigurationsabschnitt schreiben, wobei jedes Element optional ist und Standardwerte enthält. Auf diese Weise benötigt jeder, der mit den Standardeinstellungen auskommt, keine Konfigurationsdatei. Wenn sie jedoch einen Standardwert überschreiben müssen, können sie einen bereitstellen.

(Sorry, nur ein bisschen Brainstorming. Ich habe kein Beispiel zur Verfügung.)

3
ThatBlairGuy

Die beste Problemumgehung sieht so aus, als würde sie beim Start der Anwendung selbst erstellt.

  1. Fügen Sie App.Config als Ressource hinzu und benennen Sie sie in "App_Config" um.
  2. Überprüfen Sie, ob die Konfigurationsdatei vorhanden ist
  3. Wenn nicht, schreiben Sie die Standardkonfigurationsdatei

Beispielcode:

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);
        }
    }

Denken Sie daran, dass Ihre aktuelle Konfiguration nur beim Erstellen geschrieben wird. Es wird nicht automatisch aktualisiert, wenn Sie eine neue Version bereitstellen. Es enthält die Konfiguration so wie sie ist, wenn Sie bauen. Aber das könnte reichen :)

3
KoalaBear

Bitte die erste Antwort auf diesen vorherigen Beitrag - Konfigurationsdatei als eingebettete Ressource

2
Paige Cook

Wie die Leute hier sagen, geht es in einer Konfigurationsdatei darum, einige Einstellungen außerhalb der Anwendung zu ändern. Sie können hart codieren oder Konstanten verwenden. Sie können jedoch auch die Registrierung in Windows verwenden, wenn Sie möchten. Auf diese Weise können Sie Änderungen an der Anwendung vornehmen und haben trotzdem nur eine einzige Exe-Datei.

Das Code-Projekt enthält einige gute Informationen zum Lesen, Schreiben und Löschen aus der Registrierung http://www.codeproject.com/KB/system/modifyregistry.aspx Registrierung. Viele Anwendungen hängen davon ab, so dass Sie einige Einstellungen zerstören können, wenn Sie etwas falsch machen. Ich empfehle zu lesen und dann zu tun.

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;
  }
}

Natürlich funktioniert das nur unter Windows. Ich gehe davon aus, dass Sie Visual Studio verwenden, also wahrscheinlich Windows.

Viel Spaß beim Codieren und viel Glück!

2
user1105582

IL Merge hat eine Menge Probleme mit der ausführbaren Datei "wpf", auch langsam ..__ Am Ende habe ich Cosura.Fody https://github.com/Fody/Costura verwendet und Befehlszeilenparameter zum Übergeben meines App-Konfigurationswerts verwendet. Verwenden Sie auch iexpress http://en.wikipedia.org/wiki/IExpress , um die endgültige ausführbare Datei mit den Befehlszeilenargs und exe zu erstellen

1
Amit Chandel

Sie erstellen keine EXE-Datei für eine .NET-Konsolenanwendung. 

Stattdessen müssen Sie die DLL-Datei Ihrer Konsolenanwendung mit dem unten stehenden Befehl Prompt command starten (ich verwende als Beispiel die Anwendung "Hello World").

dotnet HelloWorld.dll

Die Antwort, die ich glaube, Sie suchen, da Sie möchten, dass andere Ihr Programm wie eine .exe-Datei starten können, besteht darin, eine Stapeldatei zu erstellen, die den Befehl Prompt-Befehl ausführt. 

Jeder Benutzer kann dann Ihr Programm verwenden. 

Ein Beispiel für ein Batch-Skript zum Starten unserer Anwendung "Hello World" wäre

echo off
dotnet N:\SharedDriveFolder\HelloWorldProgramFolder\HelloWorld.dll

Dann wird Ihr Programm ausgeführt, und da es sich in einem Ordner für gemeinsam genutzte Laufwerke befindet, kann es von jedem Benutzer in Ihrer Organisation ausgeführt werden.

Ich hoffe, das beantwortet Ihre Frage, weil ich Ihren Beitrag bemerkt habe und das gleiche Problem hatte. 

Ich suchte nach der .exe-Datei und es dauerte ungefähr zwei Stunden, bis ich auf diesen Artikel gestoßen bin https://docs.Microsoft.com/en-us/dotnet/core/tutorials/publishing-with-visual- Studio das hat mir geholfen, alles zusammen zu stellen.

0
Mark S