Загрузка зависимой сборки через конфигурацию - PullRequest
0 голосов
/ 24 августа 2018

У меня есть визуальный студийный проект, который работает абсолютно нормально.Но к клиенту предъявляется новое требование для размещения различных библиотек в разных папках.

У нас есть библиотека DLL, которую можно использовать в другом проекте.Есть некоторые сторонние dll, от которых зависит dll этого фреймворка.Поэтому, когда я использую эту dll из моего проекта, каждая зависимая dll копируется в мой локальный файл в сборке, поскольку свойство CopyLocal имеет значение true.

Но теперь с новым требованием мы не можем установить для свойства CopyLocal значение True.Клиент не хочет локальной копии какой-либо DLL, скорее он хочет, чтобы dll, связанная с фреймворком, находилась в каком-то месте.Когда я делаю это, зависимые DLL не загружаются.

Я знаю, что у меня есть два варианта:

  1. Я могу поместить их в GAC, но я не хочу делатьэто так, как я хочу, чтобы они поддерживали xcopy.
  2. Использование рефлексии (но я не уверен в этом, что это правильный подход)

Можем ли мы что-нибудь сделать, используя конфигурации ??

1 Ответ

0 голосов
/ 24 августа 2018

Можно настроить пути проверки сборок, используя элемент конфигурации :

Указывает базовые подкаталоги приложений для общеязыковой среды выполнения для поиска при загрузке сборок.

Пример из MSDN:

<configuration>  
   <runtime>  
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">  
         <probing privatePath="bin;bin2\subbin;bin3"/>  
      </assemblyBinding>  
   </runtime>  
</configuration>  

Однако, если рассматриваемые сборки находятся за пределами базы приложения («которая является корневым каталогом, где выполняется приложение»), у вас есть элемент конфигурации :

Указывает, где общеязыковая среда выполнения может найти сборку.

Пример из MSDN:

<configuration>  
   <runtime>  
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">  
         <dependentAssembly>  
            <assemblyIdentity name="myAssembly"  
                              publicKeyToken="32ab4ba45e0a69a1"  
                              culture="neutral" />  
            <codeBase version="2.0.0.0"  
                      href="http://www.litwareinc.com/myAssembly.dll"/>  
         </dependentAssembly>  
      </assemblyBinding>  
   </runtime>  
</configuration>  

Точную информацию о том, как среда выполнения находит сборки, вы можете найти в этой статье MSDN .

Как указывал OP, к сожалению, элемент codeBase являетсяполезная опция только для строго именованных сборок.Для частных собраний вам нужен обходной путь.Некоторые жизнеспособные идеи можно найти в этом обсуждении , такие как:

Я протестировал последнее и могу подтвердить, что оно работает:

AppDomain.CurrentDomain.AssemblyResolve += (s, e) =>
    Assembly.LoadFile(Path.Combine(Settings.Default.AssemblyPath, Path.ChangeExtension(e.Name.Substring(0, e.Name.IndexOf(',')), ".dll")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...