Как определить, где Assembly.Load () ищет сборки? - PullRequest
6 голосов
/ 15 октября 2010

У меня есть VS Надстройка, которая использует BinaryFormatter для десериализации объекта.Чтобы разрешить тип этого объекта, он вызывает Assembly.Load (objectTypeFullName), но вызывает исключение, поскольку Assembly.Load не может найти сборку ни в одном из мест, в которых он ищет.Данная сборка является родственной сборке надстройки, но кажется, что Assembly.Load () не может найти ее там.

Возможное решение состоит в том, чтобы определить, где Assembly.Load должен искать сборки.

Что мне делать?

PS: я пытаюсь не помещать эту сборку в GAC, потому что мне нужно будет обновлять ее каждый раз, когда я перекомпилирую сборку.

Ответы [ 3 ]

4 голосов
/ 16 октября 2010

Вот фрагмент кода, показывающий, как AssemblyResolve может использоваться для разрешения вашей сборки (согласно ответу Рида Копи):

// register to listen to all assembly resolving attempts:
 AppDomain currentDomain = AppDomain.CurrentDomain;
 currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);


 // Check whether the desired assembly is already loaded
 private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
    string desiredAssmebly = args.Name;
    if (desiredAssembly.Equals("NameUsedToLoadMyAssembly")){
        return Assembly.LoadFrom(myAssemblyPath);
    }

    return null;
  }

Также обратите внимание, что на странице MSDN для AssemblyResolve говорится, что:

Начиная с версии .NET Framework 4, свойство ResolveEventArgs.RequestingAssembly возвращает сборку, которая запросила загрузку сборки, которая не может быть разрешена ...

Это можно использовать, если вызнать местоположение вашей сборки относительно местоположения запрашивающей сборки.

4 голосов
/ 15 октября 2010

Вы можете использовать AppDomainSetup.PrivateBinPath , чтобы добавить дополнительные частные пути поиска.Это можно получить с помощью AppDomain.SetupInformation .

Другой вариант - подписаться на AppDomain.AssemblyResolve , чтобы переопределить поведение, когда не удается найти вашу сборку.

3 голосов
/ 15 октября 2010

Если вы просто пытаетесь определить, откуда загрузчик сборок пытается загрузить вашу dll, я рекомендую вам включить журналы fusion.Это позволит вам получить выходные данные, которые покажут вам каждый путь, который был проверен на наличие соответствующей DLL.

Существует статья MSDN о настройке журналов Fusion и полезнаястатья Сюзанны Кук о том, как отлаживать ошибки загрузки.Если вы включите LogFailures, и вы должны получить выход только для сборок, которые не удалось загрузить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...