2012-04-03 4 views
5

Ich führe eine WCF-Anwendung CoreApplication, deren VS-Projekt einen Verweis auf AncillaryProject hat. CoreApplication verwendet eine Klasse Provider von AncillaryProject; Es wird jedoch nie explizit darauf verwiesen - es wird über Reflection aufgerufen.Referenzierte Assembly nicht gefunden - Wie alle DLLs in Lösung enthalten sind

Mein Problem ist, dass manchmalCoreApplicationProvider weil AncillaryProject nicht kommen im Aufruf GetAssemblies() zu finden, fehlschlägt. Manchmal funktioniert es gut, aber manchmal (ich vermute, es kann nach einem JIT sein) schlägt es fehl.

Hier ist mein Original-Code:

var providers = from d in AppDomain.CurrentDomain.GetAssemblies() 
       from c in d.GetTypes() 
       where typeof(BaseProvider).IsAssignableFrom(c) 
       select c; 

Nachdem bei this question suchen, habe ich versucht, GetReferencedAssemblies() mit:

var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); 
foreach (var a in AppDomain.CurrentDomain.GetAssemblies()) 
{ 
    allAssemblies = allAssemblies.Union(
          a.GetReferencedAssemblies() 
          .Select(b => System.Reflection.Assembly.Load(b))); 
} 
var providers = from d in allAssemblies 
       from c in d.GetTypes() 
       where typeof(BaseProvider).IsAssignableFrom(c) 
       select c; 

Mir ist klar, dass die Frage, die ich verweisen das Problem löst durch dynamisch alle DLL-Dateien in Laden das bin-Verzeichnis, aber das hört sich für mich nicht besonders gut an. Gibt es eine bessere Möglichkeit, dies zu tun, oder lädt .NET die anderen Assemblys überhaupt nicht? Wie funktioniert das unter der Haube, und kann ich irgendetwas dagegen tun?

+1

gefunden Ihre Frage beantworten, aber es gibt einige relevanten Informationen zu dieser Frage in meiner Antwort: http://stackoverflow.com/questions/9947882/ get-assemblies-with-instantiating-them/9948404 # comment12730056_9948404 Abgesehen davon, dass "referenzierte" Assemblies in VisualStudio zur Laufzeit nicht viel bedeuten, ist die folgende Antwort zur Verwendung von Fusion Logger eine gute Hilfe. Sie sollten in der Lage sein, AncientProject.dll einfach dorthin zu kopieren, wo Fusion nach Assemblys sucht, aber es könnte einige Antworten darauf geben, wo es hinschaut. – CodingWithSpike

+0

Ahh - das gibt mir genau die Informationen, die ich wissen muss. – eouw0o83hf

+0

Follow-up für jeden, der diese Frage findet: In den dazwischen liegenden Jahren seit ich danach gefragt habe, habe ich gemerkt, dass ich das völlig falsch mache. Manchmal mag es weniger magisch sein und explizit die 'Typ's zu nennen, die du willst, ist weit, viel besser. Dies ist eine dieser Situationen. – eouw0o83hf

Antwort

9

Laut Microsoft-Dokumentation AppDomain.CurrentDomain.GetAssemblies() ruft die Assemblys, die in den Ausführungskontext dieser Anwendungsdomäne geladen wurden. About AppDomain.CurrentDomain.GetAssemblies()

Es scheint, dass Sie die Strategie des Ladens der benötigten Assemblies ändern müssen, indem Sie die Anwendungsdomäne verwenden, um nach DLLs in Ihrem Anwendungsordner zu suchen.

ich eine Diskussion über ein ähnliches Problem nicht vollständig Es wird here

+0

Ja, das beschreibt es perfekt. Vielen Dank. – eouw0o83hf

3

behandeln Sie sollten das .NET Development SDK herunterladen und FuslogVw.exe (Fusion Log Viewer) starten. Es wird über die CLR-Anwendung berichten, die versucht, .NET-Abhängigkeiten aufzulösen. Es zeigt Ihnen, wie es aussieht und wie es die Kandidaten bewertet, die sich an diesen Orten befinden.

Verwandte Themen