Autor |
Beitrag |
paddy14
      
Beiträge: 122
|
Verfasst: Do 31.05.12 18:09
Guten Abend,
ich habe folgendes Problem:
Ich habe eine DLL in C# erstellt, diese hat nur ein paar Eigenschaften wie, int id oder string name etc.
Diese DLL soll dann in dem Verzeichnis liegen wo die Anwendung liegt.
Wie kann ich diese DLL per Code einbinden?
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Do 31.05.12 18:24
Das musst du gar nicht machen.
Du musst dazu bloß in den Projektmappen-Explorer -> Verweise -> Rechtsklick -> Verweis hinzufügen
Wenn die dll in der selben Projektmappe liegt, dann gibt's dafür den Reiter Projekte.
Wenn nicht, musst du auf Durchsuchen gehen und die dll direkt suchen.
Wenn du sie dann eingebunden und das erste Debugging gestartet hast, dann wird die dll auch automatisch in das Verzeichnis der kompilierten exe gelegt und von dort auch für die Anwendung aufgerufen.
|
|
paddy14 
      
Beiträge: 122
|
Verfasst: Do 31.05.12 18:49
Das habe ich mir schon gedacht
Aber was ist wenn ich an der DLL was aendern will, muss ich dann das ganze Programm nochmal kompilieren oder reicht es wenn ich die neue DLL in den Ordner lege???
Mein Prog besteht aus einem Server Prog und einem Client Prog.
Die Klassen sollen alle in eine bzw mehrere DLL's ausgelagert werden, nur die Reine Form soll bestehen bleiben, sodass ich nur an den einzelnen DLL's Aenderungen vornehmen muss ohne jetzt gleich das ganze Programm neu zu kompilieren.
Habe mir da eig auch schon so eine Art Updatemechanismuss gebaut, wo ich dann einfach die neue(n) DLL('s) in ein bestimmtest Verzeichniss lade und diese dann die alten ersetzen.
Neue Frage:
Wenn ich es dann so mache wie du sagst, kann ich diese dann auch zur Laufzeit aendern bzw. anwenden???
Soll heissen, das wenn ich auf den Button Updaten klicke, das er sich dann diese DLL laed, in das Verzeichnis wirft und anschliessend diese auch verwenden kann.
Ich bin der Meinung das dieses nicht geht!!!
Falls es so nicht gehen sollte wie koennte ich das mit eigenem Code machen???
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Do 31.05.12 20:55
Ja, genau das ist ja Sinn und Zweck von DLLs^^
Nagut, gibt noch mehr Aufgaben, aber für eher kleinere Anwendungen ist das wohl der heraus stechenste Vorteil.
Also ja, Updates sind möglich, allerdings nur, wenn du an den bereits bestehenden Klassen und Funktionen nichts änders, was öffentlich sichtbar ist.
Damit meine ich, dass z.B. Funktionen immer mit genau dem Methoden-Kopf vorhanden bleiben müssen, wie sie vorher vorhanden waren, denn sonst gibt es im nutzenden Programm einen Syntax-Fehler.
Aber im Programmcode innerhalb einer Methode oder der Klasse, also alles, was öffentlich nicht angetastet werden kann, darf auch geändert werden.
Zur zweiten Frage:
Das ist meines Erachtens nach nicht möglich. Zumindest nicht von der selben Anwendung aus.
Was du aber machen könntest, ist die Updates in eine zweite Anwendung verlagern.
Diese Update-Anwendung ist dann die eigentlich durch die Verknüpfung gestartete Anwendung. Sie erfüllt ihre Aufgabe (Updates und so) und startet zum Schluss das eigentliche Programm, was die DLLs benötigt.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 31.05.12 21:52
Man kann Assemblies nicht entladen (das wäre nötig um sie zur Laufzeit auszutauschen). Man kann nur ganze Appdomains entladen und damit die explizit in diese geladenen Assemblies. Ich bezweifle das ein 'Updatesystem zur Laufzeit' ein so tolle Sache ist um diesen Aufwand zu betreiben.
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Do 31.05.12 22:41
Naja, nicht zur Laufzeit.
Ich denke, vor dem Start des eigentlichen Programms.
Dass vor dem Start erst mal ein Server nach aktuellen Updates durchsucht wird, die werden dann in den Ordner kopiert und anschließen startet das eigentliche Programm, dass die dlls benötigt.
|
|
paddy14 
      
Beiträge: 122
|
Verfasst: Do 31.05.12 23:01
Danke euch beiden!!!
Ich denke ich werde es so machen wie Palladin es gesagt hat mit der 2ten Anwendung die halt nur zum Updaten dient
Da ich ja imprinzip nur was an den DLL's veraendere. Die Form bleibt ja unangetastet, es sei denn dort muss ich dann auch iwann mal was aendern aber das ist ja auch nicht so das dramatische dann
juten Abend noch 
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Do 31.05.12 23:05
Dann gibts halt ein Patch zum installieren und das tauscht dann die Form aus
Bei welchem professionellen Spiel gibts sowas nicht?
Und ja, wir helfen gerne
Dir auch einen schönen Abend und gutes Gelingen^^
|
|
paddy14 
      
Beiträge: 122
|
Verfasst: Fr 01.06.12 10:08
Also wie gesagt ich werde es ja so machen wie du gesagt hast, aber es reitzt mich gerade doch ziehmlich wie man es mit Code macht
Einfach nur weil ich es wissen will, kann ja nicht schaden
Koenntet Ihr mir diesen Gefallen noch tun und mir im Groben sagen wie es geht bzw. welche Schritte dazu von noeten sind???
Danke!!!!
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 01.06.12 10:47
Schau dir einfach die Assembly Load(File|From|...) Methoden an.
Und dann mußt du aber per Reflection auf die Typen (Klassen, interfaces etc.) zugreifen.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 01.06.12 11:45
Zitat: | Koenntet Ihr mir diesen Gefallen noch tun und mir im Groben sagen wie es geht bzw. welche Schritte dazu von noeten sind??? |
Welche Schritte für was???
a.) C# DLL einbinden (Die Frage im Titel)
b.) Dll zur Laufzeit austauschen (zwischenzeitlich aufgekommene Frage)
c.) wie man eine 2.te Anwendung schreibt die die 1.te updatet?
|
|
paddy14 
      
Beiträge: 122
|
Verfasst: Fr 01.06.12 12:19
Sorry Ralf, stimmt haette mich da ein bisschen klarer ausdruecken sollen.
Dachte mir das so wie gerade TH69 gerschrieben hat.
Werde mich dann mal mit der Assembly beschaeftigen
Danke euch!!!
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 01.06.12 12:29
Zitat: | Dachte mir das so wie gerade TH69 gerschrieben hat. |
Also wie du die Dll einbindest. Dann solltest du denn Teil bezogen auf Reflection ignorieren.
Schreib dir ein Interface das die Oberfläche der Klasse in deiner Dll beschreibt und packe dieses Interface in eine 3.te Assembly.
Deine Anwendung die die Dll benutzen soll kann die Assembly die das Interface enthält dann ganz normal referenzieren. Jeder Code der in deiner Anwendung auf die Klasse in deiner dll verweist sollte nur noch auf das Interface verweisen. Dann sind alle direkten Referenzen auf die konkrete Dll weg. Jetzt kommt die einzige Stelle in der du Reflection brauchst. Nämlich das Erzeugen einer konkreten Klassen Instanz und das verwenden dieser Klasse über das Interface. Zum erzeugen dieser Klasse mußt du a.) (wie bereits gesagt) die Assembly per Assembly.Load laden und b.) eine konkrete Instanz der in der Assembly enthalten Klasse erzeugen. Zum Beispiel via Activator.CreateInstance.
|
|
paddy14 
      
Beiträge: 122
|
Verfasst: Fr 01.06.12 13:42
Ok das mit der Activator Klasse scheint das auf den ersten Blick recht einfach zu sein
ich kann es zwar gerade nicht testen, aber wenn ich zu hause bin, dann werde ich mich mal drann setzen und schaun ob ich mal solch einen Test zustande bekomme
Wenn es klappt, dann koennte man so ja unter gewissen umstanden eine gute Dynamik erreichen
Danke euch!!! Bis heut Abend dann
|
|