Referenzierte Assembly Nicht Gefunden - Wie bekomme ich alle DLLs inklusive in Lösung
Bin ich mit einem WCF-Anwendung CoreApplication
deren VS-Projekt hat einen Verweis auf AncillaryProject
. CoreApplication
verwendet eine Klasse Provider
aus AncillaryProject
; es ist jedoch nie explizit verwiesen wird - es ist aufgerufen, über Reflexion.
Mein problem ist, dass manchmal CoreApplication
nicht finden Provider
weil AncillaryProject
nicht in den Ruf zu GetAssemblies()
. Manchmal funktioniert es gut, aber manchmal (ich vermute, es sind, nach dem JIT) führt.
Hier mein original-code:
var providers = from d in AppDomain.CurrentDomain.GetAssemblies()
from c in d.GetTypes()
where typeof(BaseProvider).IsAssignableFrom(c)
select c;
Nach einem Blick auf diese Frage, versuchte ich mit GetReferencedAssemblies()
:
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;
Merke ich, dass die Frage, auf die ich verwiesen löst das problem durch das dynamische laden Sie alle dll-Dateien im bin-Verzeichnis, aber das klingt nicht besonders gut zu mir. Gibt es einen besseren Weg, dies zu tun, oder ist .NETTO-einfach nicht geladen, die anderen Assemblys überhaupt? Wie funktioniert das unter der Haube, und gibt es irgendetwas, was ich dagegen tun kann?
- Es wird nicht ganz Ihre Frage beantworten, aber es gibt einige relevante info in meiner Antwort auf diese Frage: stackoverflow.com/questions/9947882/... Andere als die Feststellung, dass "auf die" Baugruppen in VisualStudio nicht viel bedeuten, bei der Laufzeit, die Antwort unten über die Verwendung von Fusion-Logger ist eine gute Hilfe zu. Sie sollten in der Lage sein, einfach kopieren AncillaryProject.dll überall dort, wo die Fusion ist auf der Suche nach Baugruppen, aber es könnte einige Antworten liefern, wo es zu suchen.
- Ahh - das gibt mir genau die Informationen, die ich wissen müssen.
- Follow-up für wer Sie findet, diese Frage: in den dazwischen liegenden Jahren seit der Aufforderung, merkte ich, dass ich im Begriff war, über dieses in der komplett falsche Weg. Manchmal ist weniger magisch und explizit auflisten der
Type
s Sie wollen, ist weit, weit besser. Dies ist eine jener Situationen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laut Microsoft-Dokumentation
AppDomain.CurrentDomain.GetAssemblies()
bekommt die Assemblys, die geladen wurden, die in der Ausführung Kontext der Anwendungsdomäne. Über Die Anwendungsdomäne.CurrentDomain.GetAssemblies()Es scheint, dass Sie Sie brauchen, um die Strategie für das laden der assemblies müssen Sie von der Nutzung der Anwendungsdomäne auf der Suche nach dlls, die in Ihren Programme-Ordner.
Fand ich eine Diskussion über ein ähnliches problem hier
Können Sie Griff das AssemblyResolve-Ereignis und laden
AncillaryProject.dll
im event-handlerhttp://msdn.microsoft.com/en-us/library/ff527268.aspx
Sollten Sie die .NET Entwicklung-SDK und starten FuslogVw.exe (fusion log viewer). Es wird Bericht über die CLR-Anwendung zu lösen versuchen .NET-Abhängigkeiten. Es wird sich zeigen, waren Sie es suchen, und wie es bewertet die Kandidaten, die sich an diesen stellen.