Entwickler-Ecke

Verteilte Systeme - DLL erst downloaden und dann in einem Programm verwenden


Csharp-programmierer - Di 21.06.16 21:51
Titel: DLL erst downloaden und dann in einem Programm verwenden
Hallo,
ich habe eine Anwendung, die erst ohne ein weiteres Plugin laufen soll. Dann soll ein Download durchgeführt werden, in dem dieses Plugin gedownloadet wird. Und dann soll gleich mit dem Plugin weitergearbeitet werden. Geht das?


Ralf Jansen - Di 21.06.16 21:56

Ja.


Csharp-programmierer - Di 21.06.16 22:11

Lass mich raten. Irgendwie über [DLLImport ("")] ?


Ralf Jansen - Di 21.06.16 22:15

Eher nicht. Mehr sowas aus der Assembly.Load [https://msdn.microsoft.com/de-de/library/ky3942xh(v=vs.110).aspx] Ecke. Das ist aber auch nur ein Baustein.


Palladin007 - Di 21.06.16 23:36

Ich würde das allerdings nicht machen.

Wenn Plugins zur Laufzeit geladen werden sollen, dann erhöht das den Verwaltungs-Aufwand dieser Plugins und auch der Rest der ganzen Anwendung muss über jede Änderungen bei den Plugins informiert werden.

Ich sehe auch keinen Vorteil dabei, Plugins zur Laufzeit zu laden.
Ist zwar eine ganz nette Vorstellung, aber ich denke, in den meisten Fällen wird ein Neustart der Anwendung erzwungen, die Nutzer kennen das also.
Außer kannst Du zeitgleich erzwingen, dass ungeänderte Daten gespeichert werden um Konflikte und Beschädigungen von aktuell bearbeiteten Daten zu verhindern.

Die Plugins müssten dann nur einmal beim Start der Anwendung geladen werden, alle Bestandteile können diese Plugins einmal integrieren und müssen sich später nicht mehr darum kümmern.
Abgesehen davon gibt es Frameworks, die bei sowas sehr helfen. Unity bietet z.B. eine Möglichkeit, die Inhalte des IoC-Containers aus der Config zu laden und es gibt Frameworks wie MEF oder Prism.
Viele Möglichkeiten, die deine Arbeit auf das Definieren der Plugin-API und ihre Einbindung beschränken würden, das Verwalten der Plugins kann dann mit wenig Aufwand durch solche Frameworks übernommen werden.

Ich persönlich mag ja Unity ganz gerne. Für kleine "Plugins", sprich die Implementierung von Interfaces aus anderen DLLs, reicht das völlig aus und wird von Unity beinahe eigenständig übernommen.
Prism dagegen ist für komplexe Plugins besser geeignet, benötigt aber auch mehr Aufwand für die Integrierung in der Anwendung, da es eine eigene Herangehensweise fordert, nimmt dabei aber auch bei der Verwaltung von Plugins mit UI-Komponenten viel Arbeit ab.


Csharp-programmierer - Mi 22.06.16 14:10

Letzendlich handelt es sich hier um ein Setup Programm. Ich möchte dem Benutzer dafür nur eine .exe schicken, ohne irgendwelche anderen Dateien. Hat der Benutzer sich nun alle Informationen durchgelesen / bestätigt, soll ein Download durchgeführt werden. In diesem Download werden dann alle Dateien geladen, die das Hauptprogramm zum arbeiten benötigt. In der Setup .exe kann der Benutzer dann auswählen, ob eine Verknüpfung auf dem Desktop erstellt werden soll.

Ich habe mich über Verknüpfungen schon informiert und weiß daher, dass man dafür noch ein Plugin benötigt. Dieses Plugin soll dann beim Download mit heruntergeladen werden und gleich ausgeführt werden. Und nur wegen dieser Verknüpfung brauche ich dieses Plugin. Danach kann die .dll wieder gelöscht werden.

Wie mache ich das?


Ralf Jansen - Mi 22.06.16 15:43

Das Stichwort ist hier dann eher Bootstrapper und nicht Plugin.


Csharp-programmierer - Mi 22.06.16 15:57

Und wie mache ich das so, dass die Verknüpfung erstellt wird?


Delete - Mi 22.06.16 16:15

- Nachträglich durch die Entwickler-Ecke gelöscht -


Ralf Jansen - Mi 22.06.16 17:10

Ein Setup schreiben sollte man vielleicht eher einem expliziten Tool überlassen das das kann. Z.B. ein MSI erstellen ist kein Kleinkram/ und selbst wenn einem MSI egal ist ist es immer noch einfacher ein simples Setup zum Beispiel mit Innosetup zu schreiben das ein anderes normales Setup runterlädt und das dann ausführt.


Csharp-programmierer - Mi 22.06.16 17:21

Zum Thema Eigeninitiative: ich weiß, dass man für Verknüpfungen WshShell braucht, aber wenn man das nimmt, braucht man eine DLL und diese DLL wollte ich mir dann downloaden und noch nutzen.

Ralf Jansen: Ein Programm, das Lizenzen ausgeben kann und Daten downloaden und anschließend irgendwo einfügen kann, kann ich auch schon schreiben. Mit MSI wirkt es sicherlich professioneller, aber dafür braucht man dann auch wieder viel Zeit, die ich momentan nicht haben.

Wie macht man es jetzt? Angenommen ich habe die WshShell jetzt schon gedoenloaded. Wie binde ich diese jetzt ein bzw. führe den dazugehörigen Code aus?

[EDIT] Jetzt habe ich eine Idee: vielleicht eine Kosolenanwendung schreiben, in der WshShell referenziert wurde, und diese wird dann gedownloaded und geluncht, wenn der Benutzer ein Desktop Shortcut haben will. Was meint ihr dazu?


Delete - Mi 22.06.16 18:57

- Nachträglich durch die Entwickler-Ecke gelöscht -


Csharp-programmierer - Mi 22.06.16 22:38

Wenn ich mir WshShell dowloade, bekomme ich ja eine .dll Datei mitgeliefert, die ich benötige. Im COM Assemblykasten finde ich nichts derartiges. Also hätte ich jetzt noch eine andere Idee: eine Klasse, in der die DLL referenziert ist. Wenn der Download dann erfolgreich durchgeführt wurde, wird die Klasse instanziert und dann müsste es ja eigentlich funktionieren, oder?


Delete - Do 23.06.16 00:24

- Nachträglich durch die Entwickler-Ecke gelöscht -


Csharp-programmierer - Do 23.06.16 11:38

Okay. Vielen Dank für die mehr oder weniger nette Antwort


Delete - Do 23.06.16 14:46

- Nachträglich durch die Entwickler-Ecke gelöscht -


Csharp-programmierer - Do 23.06.16 15:39

Also ich habe mich auch darüber informiert (schon vor ein paar Monaten) und bin auf WshShell gestoßen. Da ich immer schon vorher etwas raussuche, was ich später eventuell in meinen Projekten verwenden kann, dachte ich man braucht auch eine DLL, was aber nicht so ist. Ist ja aber jetzt egal, ich möchte keinen Streit hier im Forum anfangen. :nixweiss: