Bežím aplikáciu WCF CoreApplication
ktorého projekt VS má odkaz na AncillaryProject
. CoreApplication
používa triedu Provider
z AncillaryProject
; nikdy však nie je výslovne uvedený - je vyvolaný pomocou Reflection.
Môj problém je to niekedy CoreApplication
nedokáže nájsť Provider
pretože AncillaryProject
neprichádza vo výzve GetAssemblies()
. Niekedy to funguje dobre, ale niekedy (hádam to môže byť po JIT) sa to nepodarí.
Tu je môj pôvodný kód:
var providers = from d in AppDomain.CurrentDomain.GetAssemblies()
from c in d.GetTypes()
where typeof(BaseProvider).IsAssignableFrom(c)
select c;
Po pohľade na táto otázka, Snažil som sa použiť 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;
Uvedomujem si, že otázka, na ktorú som odkazoval, rieši problém dynamickým načítaním všetkých dll súborov do adresára bin, ale to mi neznie obzvlášť dobre. Existuje lepší spôsob ako to urobiť?, alebo .NET jednoducho nenačíta ďalšie zhromaždenia? Ako to funguje pod kapotou, a môžem s tým niečo urobiť?
odpovede:
9 pre odpoveď č. 1Podľa dokumentácie spoločnosti Microsoft AppDomain.CurrentDomain.GetAssemblies()
získa zostavy, ktoré boli načítané do kontextu vykonávania tejto aplikačnej domény. O AppDomain.CurrentDomain.GetAssemblies ()
Zdá sa, že musíte zmeniť stratégiu načítania potrebných zostáv z používania domény na hľadanie DLL v priečinku aplikácií.
Našiel som diskusiu o podobnom probléme tu
3 pre odpoveď č. 2
Môžete spracovať udalosť AssemblyResolve a načítať ju AncillaryProject.dll
v takom prípade obsluha
http://msdn.microsoft.com/en-us/library/ff527268.aspx
3 pre odpoveď № 3
Mali by ste si stiahnuť .NET Development SDK a začať FuslogVw.exe (prehliadač fúznych protokolov). Bude hlásiť aplikáciu CLR, ktorá sa pokúša vyriešiť závislosti .NET. Ukáže vám, že sa pozerá a ako hodnotí kandidátov nachádzajúcich sa na týchto miestach.