DLL fest in App einbinden?

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von asusdk.

    DLL fest in App einbinden?

    Halli Hallo,
    ich wollte euch fragen ob ihr mir verraten könnt wie ich am besten eine DLL Datei (MySql.Data.dll) in mein Programm binden kann so das die DLL gleich im Programm mitgeliefert wird?
    Aktuell muss die Datei im gleichen Verzeichnis wie die exe des Programms liegen. Das Problem dabei ist das mein Programm nur eine exe ist also von überall aus gestartet werden kann.

    Ich habe schon einige dinge im Netz gefunden doch irgendwie scheint alles nicht zu funktionieren. Sobald ich das Programm vom zb. Desktop aus starte (also ohne das die DLL "nebenan" liegt bekomme ich im Abschnitt (siehe Code...) für die MySQL immer "Programm reagiert nicht mehr".

    VB.NET-Quellcode

    1. Imports MySql.Data.MySqlClient
    2. Private Sub feedbackButton_Click(sender As Object, e As RoutedEventArgs) Handles feedbackButton.Click
    3. Dim query = "SELECT appFeedback FROM settings"
    4. Using connection As New MySqlConnection(connectionString)
    5. Dim command As New MySqlCommand(query, connection)
    6. connection.Open()
    7. Dim reader As MySqlDataReader
    8. reader = command.ExecuteReader()
    9. While reader.Read()
    10. If reader.GetString(0) = 0 Then
    11. Else
    12. feedbackMessage_tb.MaxLength = tbLength
    13. feedbackLength_label.Content = tbLength
    14. End If
    15. End While
    16. End Using
    17. End Sub


    *Topic verschoben* ~NoFear23m

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

    Hallo @Stollejay

    Die Frage die sich mir nun stellt ist warum du dies so haben möchtest? Gibt es hierfür einen speziellen Grund?
    Wenn du die exe vom Desktop aus starten möchtest leg dir einfach eine Verknüpfung auf den Desktop und gut ists.

    PS: Ich verschieb das mal ins richtige Forum.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Oh ja, damit hab ich mich damals auch laaange rumgeschlagen, ich sag jetzt nicht das ich die Ideallösung gefunden habe, aber so verwende ich es :

    Spoiler anzeigen

    VB.NET-Quellcode

    1. If Not IO.File.Exists(PathVariable & "\" & FileNameIncludingExtensionVariable) Then
    2. Dim g As Integer = Microsoft.VisualBasic.FreeFile()
    3. Microsoft.VisualBasic.FileOpen(g, PathVariable & "\" & FileNameIncludingExtensionVariable, Microsoft.VisualBasic.OpenMode.Binary)
    4. Microsoft.VisualBasic.FilePut(g, My.Resources.FileName)
    5. Microsoft.VisualBasic.FileClose(g)
    6. End If

    Die Datei muss dabei natürlich in den Resourcen vorhanden sein ^^

    Und bevor wieder jeder sagt, das man den MS.VB-NameSpace nicht verwenden soll, ja, das ist mir bekannt, mir ist nur bislang keine VB.Net-Alternative für das FreeFile untergekommen.


    @Nofear23m
    Die Frage die sich mir nun stellt ist warum du dies so haben möchtest? Gibt es hierfür einen speziellen Grund?


    Ich kann zwar nicht für den Threadersteller sprechen, aber ich habe "Programmieren" damals mit der Scriptsprache AutoIT angefangen, dort ist es das "normalste" seine Resourcen direkt in die Executable einzubinden, man hat am Ende egal was man macht/braucht immer nur eine .exe-File, was besonders für "kleine" Anwendungen, durchaus wesentlich praktischer ist. Man muss kein Archiv weitergeben, man muss kein Setup erstellen, einfach nur die eine Datei weitergeben und gut ist. Aber vermutlich ist dies auch einfach Geschmackssache ^^

    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

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

    @Stollejay In dem Momemt, wo das Programm zum ersten Mal auf die DLL zugreift, knallt es, wenn sie nicht da ist, das kann man abfangen und dann dass Programm geordnet mit ner Meldung beenden.
    Die DLL als Ressource in die EXE reinzupacken ist suboptimal, das macht man nicht.
    Mach aus Deinem Programm-Paket eine ZIP und sag den Leuten, dass sie den Inhalt in ein Verzeichnis packen sollen und feddich.
    Alternativ kannst Du noch ein kleines Setup-Programm machen, aber das wäre oversized.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @Nofear23m Danke fürs verschieben. Gar nicht gemerkt das ich im Falschen Forum war :rolleyes:

    Wie es @asusdk schon gesagt/geschrieben hat ist es für kleine Programme wie es bei mir der fall ist die sonst nichts anderes an DLL oder sonstigen Dateien benötigen wesentlich Praktischer.
    Ich will es vermeiden die DLL extra mit als Archiv zur Exe zu liefern da man das Programm wie gesagt von überall aus starten kann. Auch ein Setup kommt hier nicht in frage.

    Gibt es denn zumindest die Möglichkeit wenn ich die DLL auf meinem Server ablege das sich das Programm bei Programmstart die DLL (Falls noch nicht vorhanden) dann in einen spezifischen Ordner wo ich auch eine settings.bak anlege fürs Programm mit dort hin runter läd? Bzw. währe das eine gute/akzeptable Lösung oder ist das auch mehr so "suboptimal"?

    Mein Programm hat nur die Aufgabe bzw. ist dafür da um es den Usern für ein bestimmtes Spiel extrem zu erleichtern Einstellungen im Spiel vor zu nehmen + ein paar Extras ohne jedes mal den langen Pfad etc. gehen zu müssen und die Dateien "kompliziert" in einem Editor bearbeiten zu müssen. Mein Programm legt nur eine settings.bak im Dokumente Ordner an und Max. 3 Dateien für Benutzerdefinierte Spieleinstellungen. Nun wollte ich noch eine kleine "Feedback" Funktion mit einbauen wo die Leute ganz einfach ein Feedback oder Vorschläge an mich schicken können welche in meiner MySQL Datenbank gespeichert werden.
    @Stollejay Wenn das nur ein kleines Programm ist, dann verteile Exe und DLL mit dem Hinweis, beide in irgend ein Verzeichnis zu packen und auszuführen.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

    Stollejay schrieb:

    welche in meiner MySQL Datenbank gespeichert werden
    Dazu benötigen die Leute vermutlich einen installierten MySQL-Provider.

    Aber die Idee ist vermutlich eh nicht so gut?
    Liegt dein DB offen im Netz?

    Du solltest ggf. darüber nachdenken, wie du die Daten über ein Web-Protokoll an deine Datenbank übermittelst.
    Z.B. über PHP oder ASP.Net.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @Stollejay
    kannst es doch mit der Version versuchen die ich oben gepostet habe, ich verwende es so und es funktioniert, .dll .exe .egalwas lässt sich so einbinden, wenn du das im FormLoad-Event machst, sollte die entsprechende Datei auch geschrieben werden, bevor er auf diese zurückgreift.
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    asusdk schrieb:

    die ich oben gepostet habe,
    Wir sind hier in einem VB.NET-Thread.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @petaod Wie meinst du das ob meine DB offen liegt?
    Wenn ich mir das aber so recht überlege ist das wohl am sichersten wenn ich die Daten an PHP übermittel und von dort aus in die db schreibe.

    Edit:
    Ich habe es nun so erst mal erfolgreich zum laufen gebracht... (Ohne DLL :) )
    Mein Problem ist jetzt noch wie ich von dem Programm aus die form in der php sende ?(

    VB.NET-Quellcode

    1. Using client As WebClient = New WebClient()
    2. Dim postData As NameValueCollection = New NameValueCollection() From {
    3. {"app_name", name},
    4. {"fb_type", type},
    5. {"fb_message", message}
    6. }
    7. Dim pagesource As String = Text.Encoding.UTF8.GetString(client.UploadValues(url, postData))
    8. MsgBox(pagesource)
    9. End Using

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Stollejay“ ()

    Es geht vlt. auch noch besser aber ich habe nun soweit alles gelöst.

    VB.NET-Quellcode

    1. Dim name As String = "TPFSM"
    2. Dim type As String = feedbackType_cb.Text
    3. Dim message As String = feedbackMessage_tb.Text
    4. Dim url As String = "http://www.website.de/form.php"
    5. Using client As WebClient = New WebClient()
    6. Dim postData As NameValueCollection = New NameValueCollection() From {
    7. {"app_name", name},
    8. {"fb_type", type},
    9. {"fb_message", message}
    10. }
    11. Dim pagesource As String = Text.Encoding.UTF8.GetString(client.UploadValues(url, "POST", postData))
    12. End Using


    Die PHP-Datei welche im VB.NET Code in der URL steht

    PHP-Quellcode

    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml"><head>
    3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    4. <title></title>
    5. <script>
    6. $(document).ready(function(){
    7. $('form').submit();
    8. });
    9. </script>
    10. </head>
    11. <body>
    12. <?php
    13. $i = 0;
    14. echo '<form method="post" action=""" name="test">
    15. <input type="text" name="app_name" value="'.$_POST["app_name"].'" /><br>
    16. <input type="text" name="fb_type" value="'.$_POST["fb_type"].'" /><br>
    17. <textarea name="fb_message" rows="4">'.$_POST["fb_message"].'</textarea><br>
    18. <input type="submit" name="appfb_post" />
    19. </form>';
    20. if ($i == 0) {
    21. $app_name = $_POST['app_name'];
    22. $fb_type = $_POST['fb_type'];
    23. $fb_message = $_POST['fb_message'];
    24. $sql = "INSERT INTO db (`app_name`, `fb_type`, `fb_message`, `fb_datetime`)
    25. VALUES ('$app_name', '$fb_type', '$fb_message', NOW())";
    26. if (!mysqli_query($mysqli, $sql)) {
    27. exit(mysqli_error());
    28. }
    29. $i = 1;
    30. }
    31. ?>
    32. </body>
    33. </html>


    Für den fall das noch jemand so ein Problem hat/bekommt ;)
    So nach ein wenig gucken im netz und ein paar tests, dürfte das die .net-konforme Lösung sein, korrigiert mich ruhig wenn ich falsch liege.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. WriteFileFromResources(Application.StartupPath & "\test2.rar", My.Resources.platform_tools)
    3. End Sub
    4. Sub WriteFileFromResources(ByVal Path As String, ByVal ResourceFile As Byte())
    5. If Not IO.File.Exists(Path) Then
    6. IO.File.WriteAllBytes(Path, ResourceFile)
    7. End If
    8. End Sub
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If