.exe auf Komputer starten wo kein VS intalliert ist

  • WPF

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Jeiss.

    .exe auf Komputer starten wo kein VS intalliert ist

    Hallo,
    die Aufgabe, die Projekt.exe Datei
    aus dem bin/Debug Ordner auf einem Rechner zu starten auf dem kein VS installiert ist, bereitet mir zur Zeit grosse Schwierigkeiten.
    Ich glaubte zu wissen, dass man die .exe-Datei eines Projektes auf einen anderen Rechner laufen lassen kann, wenn alle nötige zusätzliche Projekt-Dateien auf dem Rechner vorhanden sind.
    Und so hab ich mich dann mit meiner VS2015 Express Edition ans Programmieren rangemacht und erwartete mir keine so große Probleme um die exe-Datei auf einen anderen Rechner laufen zu lassen. Aber es sollte nicht so sein...….

    Bei meinem aktuellen Projekt handelt es sich um ein WPF Window Projekt in VB.NET
    Was die Sache schwieriger macht ist dass auch eine Datenbank im Spiel ist. Die DB wurde mit Entity Framework und Code First erstellt.
    Da meine Exe-Datei nicht auf einem anderen Rechner laufen wollte und ich mir keinen Rat mehr wusste hab ich einfach mal ein neues sehr einfaches Projekt angelegt.Das lief dann auch auf dem Rechner ohne VS.Dann hab ich ein "sehr sauberes" Code First Tutorial aus dem Internet nach programmiert. Ein ähnliches wie meins. D.h. auch mit Code First Datenbank aber halt viel kleiner. Und da es ja ein Tutorial war, bin ich davon ausgegangen, dass keine "Fehler" drin sind.
    Diese exe-Datei lief dann aber auch nicht auf dem zweiten Rechner. Konnte sie auch gar nicht! Denn in dem Tutorial-Projekt befand die DB sich gar nicht im bin/Debug Ordner… Konnte also gar nicht klappen. Und da ich den DB-Teil im Tutorial sowieso nicht so richtig verstanden hab, hab ich mir gedacht ich könnte mir mal hier im Forum ein paar Tips holen.
    Hat jemand Erfahrung mit so was?Ich weiß in dieser Sache echt nicht mehr weiter.....

    Vielen Dank im Voraus,Jeiss
    @Jeiss Wie äußert es sich, dass das Programm nicht läuft?
    Einmal musst Du neben der Exe die erforderlichen DLLs mit kopieren
    bzw.
    zusätzliche Installationen auf dem anderen Rechner ausführen.
    Zum anderen musst Du benötigte Dateien, die das Programm nicht selbst anlegt, kopieren (z.B. eine initiale Datenbank).
    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!
    Hallo,
    Schön, dass du dir Zeit nimmst.

    RodFromGermany schrieb:

    @Jeiss Wie äußert es sich, dass das Programm nicht läuft?


    Es passiert einfach gar nichts!

    RodFromGermany schrieb:

    Einmal musst Du neben der Exe die erforderlichen DLLs mit kopieren bzw. zusätzliche Installationen auf dem anderen Rechner ausführen.

    Ich hab im Zweifelsfall einfach alle im Debug Ordner vorhandene Dateien auf den anderen Rechner Kopiert. Da sind die richtigen doch bestimmt dabei?
    Die DLLs waren auf jeden fall mal dabei.
    Ich hab vergessen zu erwähnen, dass auf dem Rechner, auf dem das Projekt erstellt worden ist, die Exe problemlos aus dem Debug Ordner gestartet ist und das Programm dort gut läuft.
    Werden auf einem Rechner ohne VS noch andere Dateien aus anderen Projektordnern benötigt damit eine Exe läuft?

    RodFromGermany schrieb:

    zusätzliche Installationen auf dem anderen Rechner ausführen.


    Also eine installation auf dem zweiten Rechner in form einer Setup.exe Datei ist nicht nötig und sowieso auf dem zweiten Rechner nicht gestattet!

    Danke,
    Jeiss

    Jeiss schrieb:

    Es passiert einfach gar nichts!
    Dann musst Du Dich rantasten:
    Füge MessageBoxen im Konstruktor der MainForm hinzu und bei FormLoad und FormShown, je nachdem, was bei Dir vorkommt.
    Was ist das für ein Programm?
    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!
    Super!
    Das ist eine einfache aber wunderbare Idee! :thumbup:
    Warum ist mir das mit den Messageboxen nicht selber eingefallen!!!!

    RodFromGermany schrieb:

    Was ist das für ein Programm?

    Also es handelt sich NICHT um eine Form-Anwendung sondern um ein Window mit XAML und so....
    Im Programm "hängt" ein ViewModel als resource am Mainwindow.
    Im Konstruktor dieses VM werden dann auch gleich die Daten aus der DB geladen. Das passiert ziemlich früh im Programm.
    Aber ich schalte da mal ein Messagebox davor. Mal sehen was dann auf dem zweiten Rechner passiert.

    Ich muss aber mal eine für mich wichtige Frage los werden. Weisst du ob mein vorhaben vom Prinzip her möglich ist. Oder weisst du das auch nicht so genau?

    Melde mich nach ein paar Messagebox Test wieder.

    Danke,
    Jeiss
    @Jeiss Ich programmiere Gerätesoftware und bringe diese auf (nackten) Rechnern zum Laufen.
    Dazu wird das Programm nit allen erforderlichen DLLs kopiert (ich installiere das nicht), installiere aber zusätzliche Software, z.B. zum Betreiben einer Kamera.
    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!
    Ok,
    jetzt verstehe ich deine Frage von vorhin besser. ^^
    Also meine Anwendung greift auf nicht Anderes zu, keine Kamera, nichts.
    Nur auf die DB die ja eigentlich zur Anwendung gehört.

    Meine Anwendung dient nur dazu um Daten zu erfassen und zu speichern, und greift auch nicht auf ein anderes Programm zu.
    Von der Seite her sieht es ja dann schon mal gut aus. Wir brauchen uns bloß um die eine Anwendung zu kümmern.

    Ich hab in der Zwischenzeit einen kleinen Test auf dem anderen Rechner gemacht.

    Das Programm schafft es tatsächlich bis ins VM kurz bevor der Kontext (also) die Daten geladen werden.
    Das Window wird daher nicht geladen.
    Ich mache noch ein paar Tests und dann poste ich wahrscheinlich mal ein paar Code fragmente.

    Danke,
    Jeiss

    Jeiss schrieb:

    Nur auf die DB
    Braucht diese DB eine SQL- oder solch Installation?
    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 schrieb:

    Braucht diese DB eine SQL- oder solch Installation?

    Ja, genau das ist die Frage die ich auch nicht beantworten kann :| ???

    Ich denk nicht. Weiss es aber nicht genau! Da müsste man besser verstehen was dieses Entity Framework mit der Code First Methode da genau macht...
    Bis jetzt hab ich das immer so verstanden, dass mit Code First die DB erstellt wird und dann zum Projekt gehört und kein installiertes SQL vorhanden sein muss. VS oder EF hat irgendwie alles dabei.
    Da können wir ja nur hoffen, dass bald jemand sich dazuschaltet der das genauer weiß und deine Frage mit Gewissheit beantworten kann.

    Ok, ich versuch jetzt mal hier Code rein zu bringen.

    Wie war das nochmal....?? Welchen Button....??

    VB.NET-Quellcode

    1. Public Sub New()
    2. MessageBox.Show("ModificationsGamme New vor context")
    3. _context = New GammeModifieeContext
    4. MessageBox.Show("ModificationsGamme New hinter context")
    5. _context.GammesModifiees.Load() 'Rem: BIS HIER KLEMMT ES!
    6. MessageBox.Show("ModificationsGamme New hinter context Load()")

    Hier sind wir im Konstruktor des VM vom Mainwindow.

    Aber jetzt fällt mir was ein. Früher hab ich die Load-Methode des Kontexted nicht benutzt ich hab das irgendwie anders gemscht.....
    Mal sehen ob das mir wieder einfällt.

    Danke,
    Jeiss
    Hallo Leute

    Zwei Dinge gibt es hier welche mal beantwortet werden sollten.

    Wie ist der ConnectionString den du Entity Framework mitgibst. Anhand diesem können wir mal sehen welche DB du überhaupt erstellen willst/verwenden willst.
    SQLite, localDB, MsSQL, MySQL usw.
    Also zeige mal die OnConfiguring Methode deines Contexts.

    Was machst du initial? Also erstellst du die DB auch brav mit dbContext.Database.EnsureCreated()
    Solche Aufrufe, besonders wenn diese beim Start des Programms passieren sollten unbedingt mit einer Fehlerbehandlung versehen werden. Wenn schon kein Log dann zumindest eben mit einer Messagebox.

    Nun abgesehen davon das deine App (noch) nicht läuft sehe ich anhand deinen 5 Zeilen Code bereits zwei Fehler.
    EF Core sollte (sofern möglich) mit einem Using Block verwendet werden oder zumindest so rasch als möglich wieder Disposed werden und zum anderen ist Load() wenn man nicht zu 100% weis was man da tut eine recht schlechte Idee. Du lädst hier die komplette Tabelle "GamesModifiees" in den Ram. Kein Problem wenn man nur ein paar Datensätze hat aber das kann schnell zu einem Performanceproblem werden. Wollte ich nur am Rande anmerken.

    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. ##

    Hallo Sascha,
    willkommen in die Runde.
    Und vielen Dank für deinen Optimismus.

    Nofear23m schrieb:

    Nun abgesehen davon das deine App (noch) nicht läuft....

    Tut gut :thumbsup: , und glaub mir ich kanns gebrauchen. Ich wühle schon tagelang in meinem Problem rum....
    Nun zu deinen Fragen. Ich befürchte ich kann sie nicht alle beantworten.
    Aber mal sehen wie weit wir kommen.
    Der Anfang is noch easy. heir der Connection String:

    XML-Quellcode

    1. <add name="MajGammesDbConnectionString"
    2. connectionString="Data Source=(LocalDB)\MSSQLLocalDB;Integrated Security=True;
    3. AttachDBFilename=|DataDirectory|MajGammesTop50.GammeModifieeContext.mdf;
    4. MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />

    Hier die dazu passende Connection Klasse:

    VB.NET-Quellcode

    1. Public Class GammeModifieeContext
    2. Inherits DbContext
    3. Public Overridable Property GammesModifiees As DbSet(Of GammeModifiee)
    4. Public Overridable Property ModificationsGamme As DbSet(Of Modification)
    5. Public Sub New()
    6. MyBase.New("MajGammesDbConnectionString")
    7. End Sub
    8. End Class

    Hab jetzt auch einen "Using" vor dem Anlegen des Kontextes im VM.

    VB.NET-Quellcode

    1. Public Sub New()
    2. MessageBox.Show("ModificationsGamme New vor context")
    3. Using _context = New GammeModifieeContext
    4. MessageBox.Show("ModificationsGamme New hinter context")
    5. _context.GammesModifiees.Load() 'Rem: BIS HIER KLEMMT ES!
    6. MessageBox.Show("ModificationsGamme New hinter context Load()")
    7. End Using


    So, mehr Fragen kann ich leider nicht beantworten :(

    Nofear23m schrieb:

    Also zeige mal die OnConfiguring Methode deines Contexts.

    Muss ich so was haben? Wo gehört die Methode hin.
    Ich hab da eine wunderbare Vorlage von einem "alten Freund". ;) Ein tolles WPF Projekt wo ich öfters mal reingucke um zu sehen wie ein gutes Programm aussehen soll. Und da drin ist auch keine OnConfiguring Methode zu sehen???
    Ich dachte mit meinem Kontext wäre alles in Ordnung, da das Projekt auf dem Rechner mit VS ja recht gut läuft...
    Ok, schau dir mal die Code Fragmente an die ich oben gepostet hab. Vielleicht findest du die Antwort ja im Code.
    Was wäre deiner Meinung denn eine bessere Alternative zu "Context.Load()"
    Danke,
    Jeiss
    Hallo

    Ah, OK. EF 6 verwendest du. Sorry, ich dachte an EF Core, hier ist das ein wenig anders.

    Gut, du verwendet eine localDB, das bedeutet das localDB auch auf dem Zielrechner installiert werden muss soweit ich das bei localDB kenne.
    Siehe hier: docs.microsoft.com/en-us/sql/d…ldb?view=sql-server-ver15

    Eine alternative wäre z.b. SQLite. Dazu findest du hier etwas: medium.com/@alexandermlharris/…l-that-works-181da420899f
    Bei SQLite wird eine "Datendatei" erstellt. Da müsste am Zielrechner nichts installiert werden.

    Deshalb immer wichtig das man sich mit dem Produkt welches man verwendet beschäftigt und sich dieses zu Gemüte führt und versteht, sonst steht man dann da wie die Kuh vorm neuen Tor. Was ich meine mit dem das man nichtr mit Load() alles laden sollte, dafür müsste ich ausholen weil man es eben verstehen muss aber eine Grundregel lautet: Immer nur das laden was man im Moment braucht. Und ich bin mir nicht sicher ob du in diesem Moment die kompletten daten inkl. allen Spalten der ganzen Tabelle benötigst.

    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. ##

    Aha, also womöglich die falsch Wahl.
    Aber bevor ich auf Sachas letzten Post eingehe, hier noch ein Update zu meinem Projekt.
    Seltsamerweise meldet mir VS auf einmal eine "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt." Meldung wenn ich vor dem deklarieren meiner Kontext-Variable ein "Using" davor stelle. Und zwar in folgender Zeile:

    VB.NET-Quellcode

    1. ​ ModificationsGammeCollection = CollectionViewSource.GetDefaultView(_context.GammesModifiees.Local.ToList)
    Das bedeutet ja, dass beim laden der Daten doch was schief läuft..Oder?
    Ok aber zurück zu Sachas letzter Antwort.
    Also SQL-Light wäre in meinem Fall womöglich besser. Ok hab ich noch nie verwendet.
    Aber eine Frage die ich mir stelle. Ich hab ja jetzt schon ein .MDF DB welche auch schon Daten enthallt. Kann ich genau die gleiche .MDF Datei auch mit SQL Light weiterverwenden, oder hat SQL Light ein anders "Format"?
    Was die Load() Methode angeht, wäre das ja dann in meinem Fall nicht so wild. Denn meine DB enthält tatsächlich nur die Daten die ich tatsächlich brauch. Ich (oder Besser gesagt, Entity Framework) habe sie ja selber "gestaltet".
    Ok ich kuke mir dann mal den Link zu SQL Light an. Das muss ich aber leider auf morgen verschieben, jetzt erwarten mich andere Verpflichtungen.
    Interessant finde ich auch die Information, dass man LocalDB auch auf einen Rechner installieren kann wo man gar keinen VS oder sonst kein Programmier Programm drauf hat. Das könnte ich ja bei mir auf meinem Rechner ausprobieren. Da kann/darf ich ja installieren was ich will.

    Danke,
    Jeiss

    Jeiss schrieb:

    Seltsamerweise meldet mir VS auf einmal eine "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."

    Ja, weil nach dem Using der Context nicht mehr zur Verfügung steht. Ist Codetechnisch ein Designfehler. Ich kenne auch dein Programm nicht und weis nicht was du was und wo alles machst. EF muss man lernen, das verwendet man nicht mal eben so. Aber dann könnten wir ja in einem anderen Thread ausführlicher besprechen.

    Jeiss schrieb:

    Aber eine Frage die ich mir stelle. Ich hab ja jetzt schon ein .MDF DB welche auch schon Daten enthallt. Kann ich genau die gleiche .MDF Datei auch mit SQL Light weiterverwenden, oder hat SQL Light ein anders "Format"?

    Ne, das geht nicht. Ist ja ne völlig andere DB.

    Jeiss schrieb:

    Was die Load() Methode angeht, wäre das ja dann in meinem Fall nicht so wild. Denn meine DB enthält tatsächlich nur die Daten die ich tatsächlich brauch. Ich (oder Besser gesagt, Entity Framework) habe sie ja selber "gestaltet".

    Und da kommen auch keine dazu? Auch nicht durch den User? Später, zur Laufzeit? Wie gesagt, ich kenne dein Programm nicht, ich bin bei sowas nur immer vorsichtig.

    Beispiel: Wenn ich einen Login erstelle und prüfe ob der User das Passwort korrekt eingegeben habe rufe ich ja auch nicht alle User ab und dann in der Auflistung den entsprechenden User rauszusuchen und dann aus der Spalte mit dem Passwort dieses zu vergleichen. Ne. Ich rufe NUR die Passwortspalte von genau nur diesem einen User ab um das Passwort zu vergleichen, oder noch besser - ich lasse mir nur einen Boolean Wert von der DB zurückgeben indem ich mit Any() nur den Datensatz mit dem Usernamen und dem Passwort abrufe. Gibt es einen Eintrag bekomme ich True zurück und wenn nicht dann False. Da üsbertrage ich weitaus weniger Daten als wenn ich immer alle User mit allen ihren Daten holen würde.

    Aber auch das ist ein Therma für einen anderen Thread ;)

    Grüße
    Sascha

    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. ##

    Hallo,
    Hier mal ein kleines Update der Laage.
    Ich Habe Saschas Links zum Thema LocsalDB und SQL-Light bis jetzt nur kurz "überflogen". Heute Nachmittag kuck ich mir das mal genauer an. Konnte zwar bis jetzt noch nicht sehen wo geschrieben steht, dass man mit SQL-Light an eine Installation von SQL auf dem "Ziel-Rechner" vorbei kommt. Aber wie gesagt hab den Artikel nur überflogen.
    In mein Projekt hab ich ein Try/Catch reingetan. Ich wollte euch mal das Ergebnis vorführen. Aber es sieht schon nach einem SQL-Installations-Problem aus.
    Wie seht ihr das. (Ich hoffe jetzt bloß, dass ich mein Screenshot von de Fehlermeldung jetzt hier rein gepostet kriege. Kann doch bestimmt nicht so schwierig sein...)
    Ok, bin zu doof dafür... :(
    Versuch mal als Anhang. Mal sehen ob das klappt...
    Ich denk mal es hat diesmal geklappt. Könnt ihr euch das Bild bitte mal anschauen.

    Danke,
    Jeiss
    Bilder
    • WindowMessage_short.jpg

      34,74 kB, 410×223, 58 mal angesehen
    Soweit ich das sehe verwendest du aber immernoch den localDB Provider. Zumindest laut Fehlermeldung.
    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. ##

    Ja klar doch, hab bis jetzt noch nichts geändert. Außer, dass ich ein Try/Catch reingetan hab um diese Fehlermeldung zu kriegen.
    Hab mir deine Lektüre über SQL-Light ja noch nicht reingezogen. Mach ich heute.
    Sind das so minimale Änderungen die nötig sind damit die DB mit SQL Light erstellt wird.
    Ich hatte mich eher auf ein paar Tage Lektüre und "umprogrammieren" eingestellt....
    Na ja, wäre ja schön wenn das gar keine so grosse "Affäre" wäre.