Benutzer mit den meisten Antworten
Nach dem Formclosing importierte Dll wieder frei geben

Frage
-
Hallo. brauche mal wieder Eure hilfe, Ich babe ein Project in dem in Form 2 ein Dll geladen (Importiert) wird.
"Import MeineDll"
Nun möchte ich aber nach dem die Form2 geschlossen ist, diese Dll löschen
"My.Computer.FileSystem.DeleteFile("MeineDLL.Dll")"
Das geht aber nicht, weil die DLL immer noch vom System geladen ist.
Wann oder wie kann ich die DLL wieder vom System freigegeben, damit ich sie löschen kann ?
Antworten
-
Hallo Wild Life78,
Hallo Bernd,
anbei das versprochen Beispiel für ShadowCopy (ohne Gewähr, da ich keine Zeit zum Testen hatte). Ansonsten schließe ich mich Elmar an, es geht auch weniger kompliziert.
Schöne Grüße
Oliver
Imports System Imports System.IO Namespace MBS.ShadowCopy Class Program <LoaderOptimization(LoaderOptimization.MultiDomainHost)> _ <STAThread()> _ Public Shared Sub Main(ByVal args As String()) ' Setzen notwendiger Variablen Dim environmentPath As String = Environment.CurrentDirectory Dim cachePath As String = Path.Combine(environmentPath, "__cache") Dim configFile As String = Path.Combine(environmentPath, "MyDll.dll.config") Dim assembly As String = Path.Combine(environmentPath, "MyDll.dll") ' Anwendungsdomänen-Setup ertellen: Dim adsetup As New AppDomainSetup() adsetup.ApplicationName = "MyDll" adsetup.ShadowCopyFiles = "true" adsetup.CachePath = cachePath adsetup.ConfigurationFile = configFile ' Anwendungsdomäne erstellen: Dim domain As AppDomain = AppDomain.CreateDomain("MyNewDomain", AppDomain.CurrentDomain.Evidence, adsetup) ' DLL in neuer Domain laden domain.Load(assembly) ' AppDomain entladen und Cache bereinigen: AppDomain.Unload(domain) Directory.Delete(cachePath, True) End Sub End Class End Namespace
- Als Antwort vorgeschlagen Bernd Schlepütz Montag, 12. Oktober 2009 13:27
- Als Antwort markiert Wild-Life78 Dienstag, 13. Oktober 2009 06:35
Alle Antworten
-
Hallo,
.NET Assemblies können nicht einzeln entladen werden,
sondern nur eine gesamte AppDomain via AppDomain.Unload
Da Du Imports MeineDll verwendest, wird die Assembly in der Standard-AppDomain
der Anwendung geladen. Und die endet erst mit dem Ende des Programms.
Somit ist ein Löschen durch das Programm nicht möglich -
denn das wäre das Absägen des Astes auf dem man sitzt ;-)
Damit Du die Assembly entladen kannst, müsstest Du sie zunänst
in eine eigene Domäne laden. Das ist allerdings etwas komplexer:
Programmieren mit Anwendungsdomänen und Assemblys
Dort für Dich ggf. interessant: Erstellen von Schattenkopien von Assemblys
wobei Du dann trotz löschen zunächst noch eine Kopie im Download Cache hast.
Gruß Elmar -
mhh beiss mir daran gerade die Zähne aus, gibt es vieleicht noch eine andere Möglichkeit wo man eine Dll vieleicht nur kurzzeitig ansprechen kann, und sie dann wieder freigibt, wie zb. bei einen Streamreader. Mir ist klar das das nicht das gleiche ist, aber hoffe aus verzweifelung noch das mir Jemand ein kleines wunder verät.
Vor wenigen Monaten wusste ich noch nicht was Visual-Basic ist, bin aber seit dem gut voran gekommen , aber das mit der Schattenkopie ist mit eine Nummer zu groß. -
Hallo,
was enthält die Dll denn für Code, dass er nur kurzzeitig verfügbar sein soll?
Wenn es nur kleinere Codeschnippsel sind, so läßt sich der Code dynamisch
im Speicher erzeugen.
In Verbindung mit dem VBCodeProvider kann man Code via CompilerParameters. GenerateInMemory
nur im Speicher erzeugen lassen.
Gruß Elmar -
Ja Du hast recht, ich sollte vieleicht mal erklären um was es geht, damit ihr den Hintergrund versteht, was mein vorhaben ist. Und zwar habe ich, neulich hier die Frage vom " Antspy" gelesen http://social.msdn.microsoft.com/Forums/de-DE/visualbasicde/thread/0da8d216-cbab-46c4-aba4-491fd0f2dbd7 und ich war um erlich zu sein entsetzt, wie leicht es möglich ist, zugangnsdaten aus einem Code auszulesen. Deswegen wollte ich ganz Clever sein, und habe meine zugangsdaten zu meiner Page, in eine DLL geschrieben und diese mit dem Code vom Herrn Fleischer verschlüsselt. http://social.msdn.microsoft.com/Forums/de-DE/visualbasicde/thread/d042dc6a-3592-4282-bbe5-12434306916b. das war für mich als Anfänger eine ganze Menge Arbeit aber es hat geklappt, Meine Dll ist mit samt meinen Zugangsdaten verschlüsselt, und auch mit einem Reflector sind sie nicht zu entdecken. Mein Programm macht nun folgendes, Es entschlüsselt bei benutzung die Dll und schreibt diese neu (entschlüsselt) und tut sie dann importieren. Bis hier hin kappt alles zu meiner vollsten zufriedenheit. Aber nun muss ich diese entschlüsselten Daten auch irgendwie wieder verschwinden lassen. Ich bin der Meinung das meine zugangsdaten Niemanden was angehen, und deswegen meine Frage, wie ich eine Importierte Dll wieder löschen kann.
Aber ihr seit hier die Profis, ich glaube meine vorgehensweiße ist etwas zu kompliziert, vieleicht gibt es ja für sowas eine einfachere möglichkeit. Es kann doch eigentlich nicht sein das Private Daten in einem mit Visual Basic geschriebenen Programm so unsicher sind.
Lg Wild-Life78 und Euch allen einen schönen Sonntag -
Hallo Wild-Life78,
>>Mein Programm macht nun folgendes, Es entschlüsselt bei benutzung die Dll und schreibt diese neu (entschlüsselt) und tut sie dann importieren. Bis >>hier hin kappt alles zu meiner vollsten zufriedenheit. Aber nun muss ich diese entschlüsselten Daten auch irgendwie wieder verschwinden lassen.
Bis zu dieser Stelle konnte ich Deinen Ausführungen noch problemlos folgen. Was aber muss ich mir unter der Aussage vorstellen: "Es entschlüsselt bei benutzung die Dll und schreibt diese neu (entschlüsselt) und tut sie dann importieren." ? Schreibst Du tatsächlich die DLL neu?
Peter Fleischer benutzt für die entschlüsselte Version einen MemoryStream, also etwas was nach Beendigung der Anwendung (bzw. Form) durch Dispose() automatisch verschwindet. Da brauche ich mir keine Gedanken machen, das ich entschlüsselte Daten auf meiner Festplatte habe.
Schöne Grüße
Oliver -
Hallo Oliver,
meine Vorgehensweise in Kurzform
Die DLL liegt im verschlüsselten zustand dem Programm bei (unter anderem Namen)
Nur bei benutzung des Programms wird die Dll entschlüsselt (es wird eine Kopie mit "richtigem Namen" entschlüssel und erstellt)
Nach beendigung des Programms soll die DLL wieder gelöscht werden. (also vom prinzip nur die Kopie)
wobei genau beim verschlüsseln liegt mein Problem, weil die Dll beim starten des Programms Importirert wurde (nach dem entschlüsseln) und ich dann keinen zugriff mehr auf die dll habe.
Also bisher habe ich folgendes versucht, ich habe mit Programm1 die verschlüsselte Dll entschlüsselt und unter neuen Namen auf der Platte abgelegt,2 weil beim start des Programms2 kommt der Befehl import "MeineDll" und funktioniert auch.
Jedoch dann kann ich "Meine.DLL" nicht wieder von der Platte löschen, da sie ja erst nach beenden des Programms wieder freigegeben wird.,
Das alles ist aber zu aufwendig und kompliziert, nur weil ich nicht weis wie ich vor oder nach dem Ipmort eine DLL nutzen kann.
Richtig währe, aus "einem" Programm raus, die Datei mit Peter Fleischer seinem Programm zu Entschlüsseln und dann auch zu nutzen.
Gruß Wild-Life78 -
Hallo Oliver,
genau das problem was Wild dort beschreibt habe ich auch noch in meiner Warteliste, und finde die Lösung nicht.
Die Antwort von Elmar habe ich aufmerksam gelesen. Das scheint die Lösung zu sein. Jedoch wie immer bei der MSDN Library verstehe ich nur Bahnhof, weil die ständig mit Link zum nächsten verweisen. Und letztetlich fehlt dann das passende Beispiel.
Ich hatte derzeit genau das gleiche vor.
Meine DLL will ich schützen, weil dort einige Daten stehen die niemandem etwas angehen.
Aber genau das Problem kann ich selber nicht lösen.
Beim öffnen eines Programms sollte die DLL schon entschlüsselt sein, oder es muss eine möglichkeit geben auf eine (sich im Memory befindliche DLL Datei) zugreifen zu können.
Mir fehlt eigentlich nur ein kleines Beispiel Projekt, wie Elmar es oben beschrieben hat. Dann würde ich schon dahintr kommen.
MfG
Bernd
-
Hallo Bernd,
ich werde mal ein Beispielprojekt fertigmachen. Das dauert aber ein bischen, da ich eigentlich am arbeiten bin. Mehr folgt also später.
Schöne Grüße
Oliver- Als Antwort markiert Wild-Life78 Sonntag, 11. Oktober 2009 13:48
- Tag als Antwort aufgehoben Wild-Life78 Sonntag, 11. Oktober 2009 13:48
-
-
Hallo Oliver,
ich habe schon bei Peter auf der HomePage und natürlich auch in google gesucht. Leider ist dort nicht's zu finden.
Da ich einige Programme habe, die auch eine UpdateFunktion bieten, sind natürlich meine eMailAdresse und Passwort in jedem Programm integriert.
Es währe also schön wenn ich dort mal ne lösung für finden würde.
Mit einem Beispiel währe mir Super geholfen.
lieben dank
Bernd
-
Hallo,
gut das ich gefragt habe, denn für den Fall ist die Lösung gar nicht so kompliziert.
Man kann eine Assembly auch als Byte-Array laden, siehe Assembly. Load
Wenn Du für die "Entschlüsselung" in einen MemoryStream verwendest,
liefert Dir MemoryStream.ToArray das benötigte Array.
Dann gibt es keine Spuren auf der Platte...
Eher am Rande: Aufpassen muß man, dass der Name eindeutig ist:
http://blogs.msdn.com/junfeng/archive/2004/11/03/252033.aspx
Gruß Elmar -
Hallo Wild Life78,
Hallo Bernd,
anbei das versprochen Beispiel für ShadowCopy (ohne Gewähr, da ich keine Zeit zum Testen hatte). Ansonsten schließe ich mich Elmar an, es geht auch weniger kompliziert.
Schöne Grüße
Oliver
Imports System Imports System.IO Namespace MBS.ShadowCopy Class Program <LoaderOptimization(LoaderOptimization.MultiDomainHost)> _ <STAThread()> _ Public Shared Sub Main(ByVal args As String()) ' Setzen notwendiger Variablen Dim environmentPath As String = Environment.CurrentDirectory Dim cachePath As String = Path.Combine(environmentPath, "__cache") Dim configFile As String = Path.Combine(environmentPath, "MyDll.dll.config") Dim assembly As String = Path.Combine(environmentPath, "MyDll.dll") ' Anwendungsdomänen-Setup ertellen: Dim adsetup As New AppDomainSetup() adsetup.ApplicationName = "MyDll" adsetup.ShadowCopyFiles = "true" adsetup.CachePath = cachePath adsetup.ConfigurationFile = configFile ' Anwendungsdomäne erstellen: Dim domain As AppDomain = AppDomain.CreateDomain("MyNewDomain", AppDomain.CurrentDomain.Evidence, adsetup) ' DLL in neuer Domain laden domain.Load(assembly) ' AppDomain entladen und Cache bereinigen: AppDomain.Unload(domain) Directory.Delete(cachePath, True) End Sub End Class End Namespace
- Als Antwort vorgeschlagen Bernd Schlepütz Montag, 12. Oktober 2009 13:27
- Als Antwort markiert Wild-Life78 Dienstag, 13. Oktober 2009 06:35
-
Na das sieht doch viel versprechend aus, leider komme ich heute nicht mehr zum Testen, aber ich lass Euch das Morgen wissen,werde aufjedenfall beide varianten mal testen, und klicke dann "als beantwortet" finde es super das man hier richtige Antworten bekommt, das ist nicht in jedem Forum so.
wünsch euch noch einen schönen Abend
Danke für Eure Bemühungen -
Das mit der Schattenkopie ist mir noch nicht ganz so klar, ich rätsel immer noch wie es mir möglich ist, meine verschlüsselte dll zu entschlüsselm und ohne sie vorher auf die Platte neu zu schreiben, dann als Schattenkopie im Speicher ansprechen kann, leider ist meine Zeit heute stark begrenzt. Bernd du hast ja das gleiche vor, falls Du das hinbekommst, lass es mich mal wissen, ob das geht, meine Emailaddy hast Du ja.
Ps. Danke für Eure Gedult, sicherlich könnte ich jetzt den einfacheren Weg nehmen, aber in hauptsächlich möchte ich hier was lernen, wenn ich jetzt aufgebe nur weil eine Sache etwas komplizierter ist, dann kann ich das mit dem Programmieren auch gleich sein lassen. Aber ihr macht hier wirklich schöne Beispiel. Die Beispiele, die in der Mdsn Libarry stehen, naja ich weiß nicht, die schaffen es irgendwie immer wieder eine ganz einfache Sache sehr kompliziert zu beschreiben.
Lg Wild-Life78