Meine DLLs werden von einer Drittanbieteranwendung geladen, die wir nicht anpassen können. Meine Baugruppen müssen sich in einem eigenen Ordner befinden. Ich kann sie nicht in GAC einfügen (meine Anwendung muss mit XCOPY bereitgestellt werden). Wenn die Root-DLL versucht, eine Ressource oder einen Typ aus einer anderen DLL (im selben Ordner) zu laden, schlägt das Laden fehl (FileNotFound). Ist es möglich, den Ordner, in dem sich meine DLLs befinden, programmgesteuert (von der Stamm-DLL) zum Assembly-Suchpfad hinzuzufügen? Ich darf die Konfigurationsdateien der Anwendung nicht ändern.
quelle
if (!File.Exists(asmPath)) return searchInGAC(...);
Sie können einen hinzufügen Sondieren Pfad zu Ihrer Anwendung .config - Datei, aber es funktioniert nur, wenn die Sondierung Pfad ein , die innerhalb Ihrer Anwendung Basisverzeichnisses ist.
quelle
AssemblyResolve
Lösung so oft gesehen, gut, eine andere (und einfachere) Option zu haben.Update für Framework 4
Da Framework 4 das AssemblyResolve-Ereignis auch für Ressourcen auslöst, funktioniert dieser Handler tatsächlich besser. Es basiert auf dem Konzept, dass sich Lokalisierungen in App-Unterverzeichnissen befinden (eines für die Lokalisierung mit dem Namen der Kultur, dh C: \ MyApp \ it für Italienisch). Im Inneren befinden sich Ressourcendateien. Der Handler funktioniert auch, wenn die Lokalisierung eine Länderregion ist, dh it-IT oder pt-BR. In diesem Fall kann der Handler "mehrfach aufgerufen werden: einmal für jede Kultur in der Fallback-Kette" [von MSDN]. Dies bedeutet, dass das Framework das Ereignis auslöst, das nach "it" fragt, wenn wir für die Ressourcendatei "it-IT" null zurückgeben.
Ereignishaken
Ereignishandler
quelle
AssemblyName
Konstruktor verwenden, um den Assemblynamen zu dekodieren, anstatt sich auf das Parsen der Assemblyzeichenfolge zu verlassen.Die beste Erklärung von MS selbst :
quelle
AssemblyResolve
ist für CurrentDomain, nicht gültig für eine andere DomainAppDomain.CreateDomain
Für C ++ / CLI-Benutzer ist hier die Antwort von @Mattias S (die für mich funktioniert):
quelle
Ich habe die Lösung von @Mattias S verwendet. Wenn Sie tatsächlich Abhängigkeiten aus demselben Ordner auflösen möchten, sollten Sie versuchen, den Assembly- Speicherort anfordern zu verwenden , wie unten gezeigt. args.RequestingAssembly sollte auf Nichtigkeit überprüft werden.
quelle
Schauen Sie in AppDomain.AppendPrivatePath (veraltet) oder AppDomainSetup.PrivateBinPath
quelle
AppDomain.AppendPrivatePath
Die Dokumentation scheint darauf hinzudeuten, dass die dynamische Erweiterung desAppDomain
Suchpfads unterstützt werden sollte , nur dass die Funktion veraltet ist. Wenn es funktioniert, ist es eine viel sauberere Lösung als ÜberladungAssemblyResolve
.AppDomain.AppendPrivatePath
würde in .NET Core nichts getan und im vollständigen Framework aktualisiert.PrivateBinPath
.Ich bin von einer anderen (als doppelt markierten) Frage zum Hinzufügen des Sondierungs-Tags zur App.Config-Datei hierher gekommen.
Ich möchte dem eine Randnotiz hinzufügen - Visual Studio hat bereits eine App.config-Datei generiert, das Hinzufügen des Prüf-Tags zum vorgenerierten Laufzeit-Tag hat jedoch nicht funktioniert! Sie benötigen ein separates Laufzeit-Tag mit dem enthaltenen Test-Tag. Kurz gesagt, Ihre App.Config sollte folgendermaßen aussehen:
Es hat einige Zeit gedauert, um das herauszufinden, also poste ich es hier. Guthaben auch für das PrettyBin NuGet-Paket . Es ist ein Paket, das die DLLs automatisch verschiebt. Ich mochte einen manuelleren Ansatz, deshalb habe ich ihn nicht verwendet.
Außerdem - hier ist ein Post-Build-Skript, das alle .dll / .xml / .pdb nach / Lib kopiert. Dadurch wird der Ordner / debug (oder / release) aufgeräumt, was meiner Meinung nach versucht wird.
quelle