Veröffentlichung eines Programmes mit Dateien in der Ressource

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Uchi-Komi.

    Veröffentlichung eines Programmes mit Dateien in der Ressource

    Schönen Tag wünsche ich!
    Ich habe wieder mal mehr Fragen als Antworten und denke darüber nach, ob das altersbedingt ist.

    Möglicherweise schon, denn die Jugend glaubt meist mehr zu wissen.
    ;)

    Zur Situation:

    Ich wollte meinem Programm eine pdf- oder eine Worddatei beilegen, die per Button geöffnet wird.

    Z.B.:

    VB.NET-Quellcode

    1. System.Diagnostics.Process.Start("C:\Visual Studio 2018\AbwasserExeIntern2018\AbwasserExeIntern2018\Resources\Manning-Strickler.pdf")


    Ich habe die Datei auch der Ressource bekannt gemacht und sie steht in ihrem Verzeichnis. Funktioniert auch toll auf meinem Rechner - nur woanders nicht.

    Ich nutze die Veröffentlichung von Visual Studio 2013; ist wohl eine s.g. ClickOnce-Anwendung?

    Es scheint der Fall zu sein, dass einige Datei-Ressourcen nicht vom Setup transportiert werden obwohl sie die Ressourcen bekannt sind.

    Ich bin mir auch nicht sicher, ob das Veröffentlichungs-Tool von VS 2013 auch prüft, ob auf dem Zielrechner Framework installiert ist.

    Bekannt ist mir (namentlich) noch das Setup-Programm "Inno-Setup". Setup mit automatischer .Net Framework Installation erstellen - mit Inno Setup . Das ist für mich allerdings eine Nummer zu anspruchsvoll.

    Gibt es
    1. einen einfachen Weg und/oder hat
    2. Visual Studio 2019 ein für meine Zwecke geeignetes Setup-Programm?
    Beste Grüße!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Uchi-Komi“ ()

    Uchi-Komi schrieb:

    C:\Visual Studio 2018\AbwasserExeIntern2018\AbwasserExeIntern2018\Resources
    Dass dieser Pfad auf dem Zielrechner nicht existiert, ist naheliegend.
    Wenn, dann solltest du auf dem Zielrechner die Datei aus den Resources auf einen lokalen Pfad extrahieren und von dort ausführen.
    Aus dem Kopf und ohne Gewähr:

    VB.NET-Quellcode

    1. Dim PdfPath = Application.StartupPath & "\MyPdf.pdf"
    2. Dim fs = New IO.FileStream(PdfPath, IO.FileMode.Create)
    3. fs.Write(My.Resources.MyPdf, 0, my.Resources.MyPdf.Length)
    4. fs.Close()
    5. System.Diagnostics.Process.Start(PdfPath)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Danke und wie man so etwas aus dem Kopf - wenn auch ohne Gewähr - zaubern kann, finde ich wunderbar!

    :)

    Ich teste Deinen Vorschlag am Montag. Vorher habe ich keine zweite jungfräuliche Rechnerin.

    Noch zwei Fragen und 2 Fehlermeldungen:
    • Wohin kommt der Code? Ich habe ihn dem Button zugeordnet.
    • Ist es wie folgt korrekt?

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles btnPgrogrammbeschreibung.Click
    2. Dim PdfPath = Application.StartupPath & "\MyPdf.pdf"
    3. Dim fs = New IO.FileStream(PdfPath, IO.FileMode.Create)
    4. fs.Write(My.Resources.MyPdf, 0, My.Resources.MyPdf.Length)
    5. fs.Close()
    6. System.Diagnostics.Process.Start("C:\Visual Studio 2018\AbwasserExeIntern2018\AbwasserExeIntern2018\Resources\Manning-Strickler.pdf")
    7. 'System.Diagnostics.Process.Start("C:\Visual Studio 2018\AbwasserExeIntern2018\AbwasserExeIntern2018\Resources\Manning-Strickler.pdf")
    8. End Sub


    Und es gibt 2 Fehlermeldungen:

    2 x : "MyPdf" ist ein Typ in Resources und kann nicht als Ausdruck verwendet werden."

    Vorschlag vom Programm: "Class MyPdf" generieren.

    (Mit Klassen bin ich unerfahren.)

    Hast Du diesbezüglich noch Hinweise?

    Schönen Freitagabend wünsche ich!
    Also, Zeile 8 ist definitiv nicht richtig. Da hast du ja schon wieder nen absoluten Pfad drin, der so ja nicht funktionieren kann, wenn nicht die exakt selbe Ordnerstruktur auf dem anderen Rechner existiert. Schau dir nochmal die entsprechende Zeile in petaod's Beispiel an.

    Uchi-Komi schrieb:

    Vorschlag vom Programm: "Class MyPdf" generieren.
    Nimm File.WriteAllBytes(...).
    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!
    Erst einmal vielen Dank!

    @nafets
    Mein neuer Versuch:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles btnPgrogrammbeschreibung.Click
    2. Dim PdfPath = Application.StartupPath & "\Manning-Strickler.pdf"
    3. Dim fs = New IO.FileStream(PdfPath, IO.FileMode.Create)
    4. fs.Write(My.Resources.MyPdf, 0, My.Resources.MyPdf.Length)
    5. fs.Close()
    6. System.Diagnostics.Process.Start(PdfPath)
    7. End Sub


    @RodFromGermany:
    docs.microsoft.com/de-de/dotne…riteallbytes?view=net-5.0
    Um das zu begreifen, muss ich mich längere Zeit damit intensiv befassen.

    Ich werde prüfen, ob ich meine Anforderung herunterschraube.

    Uchi-Komi schrieb:

    Um das zu begreifen

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles btnPgrogrammbeschreibung.Click
    2. Dim PdfPath = Application.StartupPath & "\Manning-Strickler.pdf"
    3. File.WriteAllBytes(PdfPath, My.Resources.MyPdf)
    4. System.Diagnostics.Process.Start(PdfPath)
    5. End Sub
    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!
    Erstmal Danke!
    Hatte schon den Mut verloren.
    Nun gibt es nur noch eine Fehlermeldung: "MyPdf" ist ein Typ in Resources und kann nicht als Ausdruck verwendet werden."
    Und ich war mutig und habe meine erste Public Class MyPdf innerhalb des Projektes generiert:

    VB.NET-Quellcode

    1. Public Class MyPdf
    2. End Class


    Und nun? Wofür ist sie gut?

    Muss ich da noch was hineinschreiben?

    Und wenn ja was?

    Die Fehlermeldung ist noch da: "MyPdf" ist ein Typ in Resources und kann nicht als Ausdruck verwendet werden." und eine zweite:

    VB.NET-Quellcode

    1. Fehler 1 class "MyPdf" und class "MyPdf", deklariert in "C:\Visual Studio 2018\AbwasserExeIntern2018\AbwasserExeIntern2018\MyPdf.vb", verursachen einen Konflikt in namespace "Resources". C:\Visual Studio 2018\AbwasserExeIntern2018\AbwasserExeIntern2018\MyPdf1.vb 3 11 AbwasserExeIntern2021


    Ich bitte um Entschuldigung, aber ich bewege mich gerade einäugig und mit Lupe in einem mir unbekannten Gelände.
    @Uchi-Komi Wie hast Du denn das PDF Deinen Ressourcen hinzugefügt?
    ====
    Du hast da die IDE eine Klasse generieren lassen - lösch die ersstzlos.
    ====
    Mach Dir ein neues Projekt. Form mit Button und ein PDF:



    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim pfad = "c:\Temp\Test2.pdf"
    4. System.IO.File.WriteAllBytes(pfad, My.Resources.Test)
    5. System.Diagnostics.Process.Start(pfad)
    6. End Sub
    7. End Class
    und feddich.
    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!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    Danke!
    Ich baue neu auf und melde mich dann wieder.
    Die Dateien habe ich bislang nach Deinen ersten zwei Schritte eingefügt:
    Ressources hinzufügen/Vorhandenes Element/
    ("Vorhandene Datei" gibt es in meiner Version nicht. Es ist wohl anzunehmen, dass "Vorhandenes Element" in meiner Version damit gleichwertig ist.)
    Es ist wahrscheinlich - wie Du vermutest , dass ich durch das viele Probieren einige Fehler im Programm verursacht habe.
    @Uchi-Komi Mit welchem Studio arbeitest Du?
    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!
    @Uchi-Komi Das ist vorhanden.
    Du bist wahrscheinlich einen falschen Weg gegangen.
    Projekt => Eigenschaften => Ressourcen => Ressource hinzufügen => vorhandene Datei hinzufügen ...
    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!
    Problem mit Eurer Hilfe und einem Codeschnipsel aus diesem Forum gelöst!

    Das getestete Ergebnis mit einer Form und zwei Button schaut so aus:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. '################################# 1. Verzeichnis anlegen (Code aus dem Forum) ###################################################################
    4. If My.Computer.FileSystem.DirectoryExists("C:\TempVisualStudio") = False Then
    5. My.Computer.FileSystem.CreateDirectory("C:\TempVisualStudio")
    6. End If
    7. '################################ 2. pdf-Datei aus der Resources in o.g. Temp-Verzeichnis kopieren und öffnen #######################
    8. Dim pfad = "c:\\TempVisualStudio\Test2.pdf"
    9. System.IO.File.WriteAllBytes(pfad, My.Resources.Test2)
    10. System.Diagnostics.Process.Start(pfad)
    11. End Sub
    12. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    13. '################################# 1. Verzeichnis anlegen ###################################################################
    14. If My.Computer.FileSystem.DirectoryExists("C:\TempVisualStudio") = False Then
    15. My.Computer.FileSystem.CreateDirectory("C:\TempVisualStudio")
    16. End If
    17. '################################ 2. Word-Datei aus der Resources in o.g. Temp-Verzeichnis kopieren und öffnen #######################
    18. Dim pfad = "c:\\TempVisualStudio\Test21.docx"
    19. System.IO.File.WriteAllBytes(pfad, My.Resources.Test21)
    20. System.Diagnostics.Process.Start(pfad)
    21. End Sub
    22. End Class

    • Genutzt wurde der wenig anspruchsvolle aber funktionierende Installer von Visual Studio 2013.
    • Das Deinstallieren funktionierte ebenso problemlos.
    • Schönheitsfehler: Die angelegten Dateien und das Verzeichnis, hier "C:\TempVisualStudio" bleiben auf dem Rechner und müssen ggf. manuell gelöscht werden. Stört mich nicht.
    • Die Dateien sollten sich - auch wenn die Dateierweiterungen verschieden sind - in ihren Namen unterscheiden weil in der Resources die Dateierweiterungen ohne Weiteres nicht erkennbar sind.
    Nochmals vielen Dank!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Uchi-Komi“ ()

    @Uchi-Komi Mit dem Wissen, dass das System ein temporäres Verzeichnis bereithält, lässt sich Dein Code etwas kürzer schreiben:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim pfad = Path.GetTempPath & "Test.pdf"
    3. System.IO.File.WriteAllBytes(pfad, My.Resources.Test)
    4. System.Diagnostics.Process.Start(pfad)
    5. End Sub
    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!