Wie binde ich eine Textdatei in eine .NET-Assembly ein?

118

Ich möchte eine Textdatei in eine Assembly einbetten, damit ich den Text laden kann, ohne ihn von der Festplatte lesen zu müssen, und damit alles, was ich brauche, in der exe enthalten ist. (Damit es tragbarer ist)

Gibt es eine Möglichkeit, dies zu tun? Ich nehme etwas mit den Ressourcendateien an?

Und wenn Sie können, wie machen Sie das und wie laden Sie den Text programmatisch in eine Zeichenfolge?

Adam Haile
quelle

Antworten:

147

Klicken Sie mit der rechten Maustaste auf die Projektdatei und wählen Sie Eigenschaften.

Wechseln Sie im folgenden Fenster zur Registerkarte Ressourcen. Wenn sich in der Mitte der Registerkarte nur ein blauer Link befindet, klicken Sie darauf, um eine neue Ressource zu erstellen.

Geben Sie hier die Bildbeschreibung ein

Wählen Sie dann in der Symbolleiste über der Registerkarte aus, dass Sie eine neue Textdatei hinzufügen möchten, geben Sie ihr einen Namen. Sie wird Ihrem Projekt hinzugefügt und geöffnet.

Wenn Sie so weit kommen, können Sie in Ihren Code Resources.TheNameYouGaveTheTextFileHere eingeben und auf dessen Inhalt zugreifen. Beachten Sie, dass Sie beim ersten Verwenden der Resources-Klasse in einer Klasse eine using-Direktive hinzufügen müssen (drücken Sie Strg +., Nachdem Sie Resources eingegeben haben, um das Menü aufzurufen, in dem VS dies für Sie erledigt).

Wenn etwas über die obige Beschreibung unklar war, hinterlasse bitte einen Kommentar und ich werde ihn bearbeiten, bis er vollständig oder sinnvoll ist :)

Lasse V. Karlsen
quelle
1
Wie würde der Code "using" aussehen, ich kämpfe darum, dass dies funktioniert. Ich habe die solutions.txt als Ressource hinzugefügt, aber sie kann Resources.solutions nicht finden. Ich habe das Gefühl, dass mir die using-Direktive fehlt.
Spedge
3
Ah-hah, alles was ich tun musste war ein My hinzuzufügen. nach vorne (dh My.Resources.solutions) Simples!
Spedge
2
Das Hinzufügen einer Ressource generiert und schließt Properties\Resources.Designer.csmit ein namespace YourProjectRootNamespace.Properties, sodass Sie verwenden müssen YourProjectRootNamespace.Properties. ProjectRootNamespacewird in den Eigenschaften Ihres Projekts in VisualStudio definiert.
Ilyaigpetrov
1
Wenn ich auf diese Weise eine Textdatei hinzufüge und sage, dass die Textdatei Teil meiner Lösung ist ... Wenn diese Datei aktualisiert wird und ich die Assembly neu erstelle, wird dann auch die eingebettete Ressource aktualisiert? Oder muss ich die Datei manuell entfernen / erneut hinzufügen, wenn ich sie jemals ändere?
Peter Tirrell
3
Dateien werden zur Kompilierungszeit in Ressourcen gepackt, nicht wenn Sie sie hinzufügen. Sie können die Datei in einem beliebigen Tool frei ändern und neu erstellen. Die Änderungen sind Teil Ihrer Assembly.
Lasse V. Karlsen
38

In Visual Studio 2003, Visual Studio 2005 und möglicherweise früheren Versionen (dies funktioniert auch 2008) können Sie die Textdatei in Ihr Projekt aufnehmen und dann im Bereich "Eigenschaften" die Aktion auf "Eingebettete Ressource" setzen. Anschließend können Sie mit auf die Datei als Stream zugreifen Assembly.GetManifestResourceStream(string).

Andere Antworten hier sind bequemer. Der Vollständigkeit halber füge ich dies hinzu.

Beachten Sie, dass dieser Ansatz zum Einbetten anderer Dateitypen wie Bilder, Symbole, Sounds usw. funktioniert.

Drew Noakes
quelle
8
Hinweis: Verwenden Sie den Namespace + Dateiname als Parameter für GetManifestResourceStream (), z. B. "MyNamespace.MyTextfile.txt". Sie können auch GetManifestResourceNames () aufrufen, um eine Liste aller Namen abzurufen.
Stiefel
32

Verwenden Sie diese Datei nach dem Einbetten einer Textdatei an einer beliebigen Stelle in Code wie diesem ...

global::packageName.Properties.Resources.ThatFileName
Narottam Goyal
quelle
3
Dies ist ein viel besserer Ansatz, da beim Entfernen der Ressource ein Compilerfehler ausgelöst wird. Tippfehler werden ebenfalls beseitigt. Danke für den Beitrag.
Ben Gripka
+5. Kann ich es innerhalb der C # -DLL-Ebene in die Datei zurückschreiben?
Prajwal Bhat
1
Was ist, wenn ich ThatFileNameaus einer Variablen angeben möchte ?
c00000fd
4

Ja, Sie sind richtig - erstellen Sie eine Ressourcendatei. Wenn Sie dies tun, müssen Sie die Zeichenfolge nicht "laden", sie wird als Resource.WhateverStringYouDefined bezeichnet.

Otávio Décio
quelle
2

Folgendes hat bei mir funktioniert. (Ich musste den Inhalt einer Datei lesen, die in eine ausführbare .NET-Image-Datei eingebettet war.)

Bevor Sie etwas unternehmen, fügen Sie Ihre Datei in Ihre Lösung in Visual Studio ein. (In meinem Fall VS 2017 Community.) Ich habe in den Ordner mit der Solution Explorerrechten Maustaste gewechselt, die Datei ausgewählt und ausgewählt. (Sagen Sie , .) Klicken Sie dann mit der rechten Maustaste auf die enthaltene Datei, wählen Sie aus und wählen Sie als aus .PropertiesAdd Existing ItemFileName.txtSolution ExplorerPropertiesBuild ActionEmbedded Resource

Verwenden Sie dann diesen Code, um seine Bytes zu lesen:

string strResourceName = "FileName.txt";

Assembly asm = Assembly.GetExecutingAssembly();
using( Stream rsrcStream = asm.GetManifestResourceStream(asm.GetName().Name + ".Properties." + strResourceName))
{
    using (StreamReader sRdr = new StreamReader(rsrcStream))
    {
        //For instance, gets it as text
        string strTxt = sRdr.ReadToEnd();
    }
}

Beachten Sie , dass Sie in diesem Fall nicht , dass die Datei als Ressource hinzufügen müssen wie in der vorgeschlagenen akzeptierten Antwort .

c00000fd
quelle
1

Folgendes habe ich getan:

  1. Meine Dateien (Ressourcen) wurden in Visual Studio hinzugefügt, indem Sie mit der rechten Maustaste auf das Projekt klicken.
  2. Klicken Sie mit der rechten Maustaste auf jede Datei, die Sie hinzugefügt haben, und ändern Sie den "Build-Typ" in "Eingebettete Ressource".
  3. So greifen Sie auf die Ressource zu:

    ein. Habe die aktuelle Baugruppe mit der Funktion erhalten:GetExecutingAssembly()

    b. Die Ressource, die ich hinzugefügt habe, war eine Textdatei, also habe ich sie mit in einen Stream eingelesen GetManifestResourceStream(fileName). Ich habe auf die Dateinamen zugegriffen, indem ich angerufen habeGetManifestResourceNames()

    c. Verwenden Sie nun eine StreamReader()Klasse, um bis zum Ende der Datei in eine Variable zu lesen, wenn Sie dies wünschen.

Pavan
quelle
0

Hinzufügen zu Pavans Antwort, um die aktuelle Versammlung zu erhalten (im allgemeinen Abschnitt):

Assembly _assembly;

GetManifestResourceStream (Dateiname) (im Code, in dem das Lesen aus der Ressource erforderlich ist):

try
{
    _assembly = Assembly.GetExecutingAssembly();
    _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
}
catch
{
    Console.WritelLine("Error accessing resource!");
}
Narjis Hasan
quelle