Um das Problem klar zu beschreiben, schauen wir uns zunächst ein Beispiel an. In diesem Beispiel gibt es eine -Schaltfläche auf WinFürm. Wenn der Benutzer auf diese Schaltfläche klickt, wird eine vorhandene Assembly geladen und das Label-Steuerelement auf der Benutzeroberfläche wird geladen geladen werden. Der vollständige Name dieser Assembly wird auf angezeigt. Freunde, die mit Reflection ein wenig vertraut sind, wissen, dass dies eine sehr einfache Sache ist. Sie müssen nur die Assembly.LoadFile-Methode verwenden, um die Assembly abzurufen, und dann das FullNameAttribut verwenden B. den folgenden Code:
private void button1_Click(object sender, EventArgs e) { Assembly assembly = Assembly.LoadFile(@"C:\testlib.dll"); label1.Text = assembly.FullName; }
Von Natürlich wird das Programm normal ausgeführt, es werden keine Kompilierungs- oder Laufzeitfehler gefunden. Wenn Sie jedoch die aufgerufene testlib.dll kompilieren, ohne dieses Programm zu beenden, werden Sie feststellen, dass Visual Studio die Kompilierung nicht abschließen kann und Sie darauf hinweist, dass die Datei von anderen verwendet wird Verfahren.
Tatsächlich ist unser Programm nicht eng mit dieser testlib.dll verbunden. Unser Programm zeigt nur die grundlegenden Informationen von testlib.dll an. Wenn es sich bei testlib.dll um eine gemeinsam genutzte Bibliothek handelt, wirken sich ressourcenexklusive Probleme auf die normale Arbeit anderer Programme aus.
Assembly verfügt nicht über die Entladefunktion, aber Sie können AppDomain verwenden, um dieses Problem zu lösen. Die Grundidee besteht darin, eine neue AppDomain zu erstellen, die Assembly in diese neue AppDomain zu laden, die darin enthaltenen Methoden aufzurufen und dann die erhaltenen Ergebnisse zurückzugeben. Rufen Sie nach Abschluss aller Vorgänge die AppDomain.Unload-Methode auf, um die neu erstellte AppDomain zu deinstallieren, wodurch auch die Assembly deinstalliert wird. Hinweis: Sie können eine geladene Assembly nicht direkt an die aktuelle Anwendungsdomäne (AppDomain) zurückgeben.
Erstellen Sie zunächst einen RemoteLoader. Dieser RemoteLoader wird verwendet, um die Assembly in die neu erstellte AppDomain zu laden und ein Attribut nach außen zu veröffentlichen, damit die Außenwelt den vollständigen Namen der Assembly erhalten kann. RemoteLoader muss von MarshalByRefObject erben. Der Code lautet wie folgt:
public class RemoteLoader : MarshalByRefObject { private Assembly assembly; public void LoadAssembly(string fullName) { assembly = Assembly.LoadFrom(fullName); } public string FullName { get { return assembly.FullName; } } }
Zweitens erstellen Sie einen Loc allelader. Die Funktion von LocalLoader besteht darin, eine neue AppDomain zu erstellen und dann RemoteLoader in dieser neuen AppDomain aufzurufen, um eine Assembly zu erstellen und Assembly-bezogene Informationen über RemoteLoader abzurufen. Die zu diesem Zeitpunkt aufgerufene Assembly wird natürlich in die neue AppDomain geladen. Schließlich muss LocalLoader auch eine neue Methode bereitstellen, nämlich die AppDomain-Deinstallation. Der Code lautet wie folgt:
public class LocalLoader { private AppDomain appDomain; private RemoteLoader remoteLoader; public LocalLoader() { AppDomainSetup setup = new AppDomainSetup(); setup.ApplicationName = "Test"; setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; setup.PrivateBinPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "private"); setup.CachePath = setup.ApplicationBase; setup.ShadowCopyFiles = "true"; setup.ShadowCopyDirectories = setup.ApplicationBase; appDomain = AppDomain.CreateDomain("TestDomain", null, setup); string name = Assembly.GetExecutingAssembly().GetName().FullName; remoteLoader = (RemoteLoader)appDomain.CreateInstanceAndUnwrap( name, typeof(RemoteLoader).FullName); } public void LoadAssembly(string fullName) { remoteLoader.LoadAssembly(fullName); } public void Unload() { AppDomain.Unload(appDomain); appDomain = null; } public string FullName { get { return remoteLoader.FullName; } } }
Ändern Sie abschließend den Button ClickEreignisbehandlungsprozess auf unserem WinForm in den folgendes Format:
private void button1_Click(object sender, EventArgs e) { LocalLoader ll = new LocalLoader(); ll.LoadAssembly(@"C:\testlib.dll"); label1.Text = ll.FullName; ll.Unload(); }
Nach Abschluss der oben genannten Änderungen kann unser Programm auch den vollständigen Namen der Assembly korrekt anzeigen. Darüber hinaus deinstalliert das Programm nach der Anzeige der Assembly-Informationen aktiv die neu erstellte AppDomain, um zu verhindern, dass testlib.dll ressourcenexklusiv ist und Auswirkungen hat Der Betrieb anderer Programme.
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des dynamischen Lade- und Entladecodes von AppDomain und Assembly. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!