Ссылочная сборка не найдена - как включить все библиотеки DLL в решение - PullRequest
5 голосов
/ 03 апреля 2012

Я запускаю приложение WCF CoreApplication, проект VS которого имеет ссылку на AncillaryProject.CoreApplication использует класс Provider из AncillaryProject;однако на него никогда не ссылаются явно - он вызывается через Reflection.

Моя проблема в том, что иногда CoreApplication не удается найти Provider, поскольку AncillaryProject не появляется в вызоведо GetAssemblies().Иногда это работает нормально, но иногда (я предполагаю, что это может быть после JIT), это терпит неудачу.

Вот мой оригинальный код:

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

После просмотра этого вопроса, я пытался использовать 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;

Я понимаю, что вопрос, на который я ссылался, решает проблему путем динамической загрузки всех файлов DLL в каталоге bin, но это не очень хорошомне. Есть ли лучший способ сделать это , или .NET просто не загружает другие сборки вообще? Как это работает под капотом , и я могу что-нибудь с этим поделать?

Ответы [ 3 ]

9 голосов
/ 12 апреля 2012

Согласно документации Microsoft AppDomain.CurrentDomain.GetAssemblies() получает сборки, которые были загружены в контекст выполнения этого домена приложения. О AppDomain.CurrentDomain.GetAssemblies ()

Похоже, вам нужно изменить стратегию загрузки необходимых вам сборок с использования домена приложения на поиск библиотек в папке ваших приложений.

Я нашел обсуждение похожей проблемы здесь

3 голосов
/ 10 апреля 2012

Вы должны загрузить .NET Development SDK и запустить FuslogVw.exe (программа просмотра журнала Fusion).Он сообщит о приложении CLR, которое пытается разрешить зависимости .NETОн покажет вам, где он выглядит и как оценивает кандидатов, находящихся в этих местах.

3 голосов
/ 03 апреля 2012

Вы можете обработать событие AssemblyResolve и загрузить AncillaryProject.dll в этот обработчик события

http://msdn.microsoft.com/en-us/library/ff527268.aspx

...