Как установить путь библиотеки С# для приложения?

У меня есть приложение С#, которое использует dll. Когда я пытаюсь запустить приложение, он не может найти dll, если он не находится в том же каталоге или в GAC. Я не хочу иметь его в том же каталоге, и я не хочу его устанавливать в GAC. Есть ли способ сообщить программе, где искать библиотеку? (Например, если я хочу распространять приложение для клиентов, и они хотят использовать свои собственные приложения, которые будут использовать DLL.)

Добавлено:

Я хотел бы иметь эту структуру:

MainFolder: библиотеки, приложения

Библиотеки: lib.dll

Приложения: app1.exe

Я не хочу копировать его в GAC или иметь lib.dll в папке Applications. Возможно ли это?

Ответ 1

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

VB6 используется для обмена dll между приложениями, у нас есть термин для этого: DLL Hell

Ответ 3

В главной:

 AppDomain.CurrentDomain.AssemblyResolve += (s,e)=>{
    var filename = new AssemblyName(e.Name).Name;
    var path = string.format(@"C:\path\to\assembly\{0}.dll",  filename);
    return Assembly.LoadFrom(path);
 };

Добавьте к этому обработку исключений

Ответ 4

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

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

Ответ 5

Это возможно без GAC, но сборки должны быть сильными, и вы должны вносить изменения в app.config всякий раз, когда изменяется версия или публикация. Это то, что у меня есть Главная программа в \, общие библиотеки в \Shared. и подпрограмму, которую я хочу разделить в \SDK, она использует.. \Shared для сборок.

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="shared" />
      <dependentAssembly>
         <assemblyIdentity name="protobuf-net" publicKeyToken="257b51d87d2e4d67" />
         <codeBase version="1.0.0.282" href="../protobuf-net.dll"/>
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="SevenUpdate.Base" publicKeyToken="5d1aea1de74f122c" />
         <codeBase version="11.5.4.0" href="../SevenUpdate.Base.dll"/>
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="SharpBits.Base" publicKeyToken="5d1aea1de74f122c" />
         <codeBase version="11.5.5.0" href="../SharpBits.Base.dll"/>
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="System.Windows" publicKeyToken="5d1aea1de74f122c" />
         <codeBase version="11.5.5.0" href="../System.Windows.dll"/>
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="WPFLocalizeExtension" publicKeyToken="5d1aea1de74f122c" />
         <codeBase version="11.5.5.0" href="../WPFLocalizeExtension.dll"/>
       </dependentAssembly>
    </assemblyBinding>
  </runtime>

Ответ 7

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

Инструмент для этого - "FUSLOGVW.exe" (Fusion Log Viewer, Fusion - имя загрузчика) и включен в SDK.