Resource in Projekt einbetten

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von MarcelBB.

    Resource in Projekt einbetten

    Visual Studio. VB Net.

    In meinem kleinen Projekt möchte ich ein paar Textdateien und Grafiken einbetten.
    Sobald ich kompiliere und die Anwendung für andere bereitstelle, werden diese Dateien aber nicht gefunden.
    Wenn ich in die Resourcen meines Projekts gehe, steht dort ausgegraut:

    Persistence: Zur Kompilerzeit verknüpft.

    Wie kann ich diese Dateien in eine eingebettete Ressource ändern?
    @MarcelBB Projekt -> Eigenschaften -> Ressourcen ...
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Irgenwo habe ich da scheinbar ein grundsätzliches Verständnisproblem....
    Ich füge die Dateien als Datei hinzu. Nach dem Kompilieren findet "er" die Dateien dann nicht mehr. Evtl. hat das auch mit OneDrive zu tun. Was mache ich verkehrt?
    Bilder
    • File1.png

      42,89 kB, 1.890×475, 20 mal angesehen
    • File2.png

      13,76 kB, 462×204, 19 mal angesehen
    @MarcelBB Er zeigt an: "Zur Kompilierzeit verknüpft", das geht schief, wenn Dein Programm auf einem anderen Rechner läuft.
    Kopiere mal die Datei erst in das Ressource-Verzeichnis Deines Projekts und füge sie danach Deinem Projekt als vorhandene Datei hinzu.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Man kann beliebige Dateien, auch EXE-Dateien in die Ressourcen packen. Man muss nur die Endung weglassen, dann sind es einfach nur Binärdateien.

    Als Beispiel habe ich in meinen Projekten überall auch gleich Anydesk Fernwartungclient in den Ressourcen und entpacke diese direkt auf den Windows-Desktop (dort finden es die User am einfachsten).

    VB.NET-Quellcode

    1. If Not File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "AnyDesk Fernwartung.exe")) Then
    2. IO.File.WriteAllBytes(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "AnyDesk Fernwartung.exe"), My.Resources.fernwartung1)
    3. End If


    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @Dive26: Nach so etwas hatte ich gesucht. Meine .exe und .csv bekomme ich so gut in den Griff und kann sie bei der Installation wieder "auspacken" und in die entsprechenden Verzeichnisse verteilen.
    Was ich aber nicht hinbekomme, sind Bitmaps. das muss wohl anders konstruiert werden..

    VB.NET-Quellcode

    1. ' Screenshots
    2. If Not File.Exists(InstallPath & "\MTI Signal Screenshot Copper and Silver.png")
    3. ThenIO.File.WriteAllBytes(InstallPath & "\MTI Signal Screenshot Copper and Silver.png", My.Resources.MTI_Signal_Screenshot_Copper_and_Silver)
    4. End If


    erzeugt mir den Fehler BC30311:
    Der Wert vom Typ Bitmap kann nicht in Byte(9 konvertiert werden.

    Wie muss das Ganze aussehen, damit es auch mit Bitmaps klappt?
    Vielen Dank!
    @MarcelBB Wie hast Du denn die Bitmaps in das Projekt bzw. in die Exe bekommen?

    VB.NET-Quellcode

    1. Dim bmp As Bitmap = My.Resources.NAME_DEINES_BILDES
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany:
    Die Bitmaps wie auch die .exe Dateien habe ich einfach als Resource hinzugefügt. Bin mir nicht mehr sicher, ob als Bild oder einfach als Datei und sie wurden als Bilder erkannt.
    Die .exe Datei kann ich, wie von Dive26 beschrieben, problemlos mit WriteAllBytes in das vorgesehene Verzeichnis als xyz.exe schreiben

    Quellcode

    1. ' CHR Treiber auf Desktop speichern
    2. If Not File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "CH341SER.exe")) Then
    3. IO.File.WriteAllBytes(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "CH341SER.exe"), My.Resources.CH341SER)
    4. End If


    Die .csv Dateinen schreibe ich analog mit WritelAllText und erzeuge sie so neu.

    Quellcode

    1. ' Prüfen ob UserDatabase existiert und ggf. erzeugen
    2. Dim InstallPath = Application.StartupPath.Trim
    3. If Not File.Exists(InstallPath & "\UserDatabase.csv") Then
    4. IO.File.WriteAllText(InstallPath & "\UserDatabase.csv", My.Resources.UserDatabase)
    5. End If


    Nur bei der Bitmap gibt es obiges Problem.

    Ich könnte sie - evtl. ohne Endung .png - als "Sonstige Datei" als Ressource anlegen und dann mit WriteAllBytes so wie die .exe wieder schreiben. Probiere ich jetzt mal aus.

    MarcelBB schrieb:

    und sie wurden als Bilder erkannt.
    Dann behandle sie wie Bilder (Bitmap-Instanzen) und nicht als Byte-Arrays.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermanyIch weiß nicht, ob du dir dabei dies hier vorgestellt hast, aber es scheint zu funktionieren:

    Quellcode

    1. Dim InstallPath = Application.StartupPath.Trim ' Finde den Pfad der aktuellen Installation
    2. If Not File.Exists(InstallPath & "\MyScreenshot.png") Then
    3. Dim Screenshot As Image ' Definiere Screenshot als Image (Bitmap)
    4. Dim SavePath = InstallPath & "\MyScreenshot.png" ' Lege den Speicherpfad fest
    5. Screenshot = My.Resources.MyScreenshot ' Weise dem leeren Image "Screenshot", den Inhalt der Resource "MyScreenshot" zu
    6. Screenshot.Save(SavePath, Imaging.ImageFormat.Png) ' Speichert den Inhalt der Resource als Bitmap
    7. End If
    @MarcelBB

    Bilder würde ich als Bilder in den Ressourcen speichern und auch so behandeln. Speziell wenn Du die ohnehin in der Software benötigst, dann gleich aus den Ressourcen in die Picturebox etc. laden.

    Wenn Du die aber unbedingt mit meiner Byte-Routine auf die Festplatte speichern möchtest, dann musst Du einfach beim hinzufügen zu den Ressourcen die Endung weglassen.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Ich habe es jetzt mal so wie oben beschrieben gemacht und es funktioniert sehr gut. Wäre halt schön, wenn bei VB mal irgendetwas stringent einheitlich wäre, das würde es Anfängern und Gelegenheitsusern wie mir viel einfacher machen. Letztlich sind das alles nur Bitfolgen auf der Festplatte, ob nun Text, Bild, Sound oder was auch immer. So ein hypothetisches "IO.File.WriteImage" (Das es nicht gibt!) wäre irgendwie logischer gewesen. Die vielen Sonderkonstrukte, nicht nur hierbei, vergällen es einem manchmal. Aber gut ist halt so, muss man eben mehr lernen und lesen. Wenn die VB Hohepriester der Meinung sind, nur so ist es richtig, dann kann man sich da nur noch eigene Klassen o.ä. basteln oder muss damit leben. Meiner Meinung nach sollte aber immer die Maschine dem Menschen dienen und nicht umgekehrt. /Blabla ;)