Как установить путь к библиотеке C # для приложения? - PullRequest
10 голосов
/ 10 марта 2009

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

Добавлено:

Я хотел бы иметь такую ​​файловую структуру:

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

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

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

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

Ответы [ 7 ]

8 голосов
/ 10 марта 2009

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

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

6 голосов
/ 10 марта 2009
4 голосов
/ 10 марта 2009

В вашем главном:

 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);
 };

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

1 голос
/ 06 мая 2011

Это возможно без GAC, но сборки должны иметь строгое имя, и вы должны вносить изменения в app.config всякий раз, когда изменяется версия или publickeytoken. Это то, что у меня есть Основная программа в \, Shared libs в \ 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>
1 голос
/ 10 марта 2009

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

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

0 голосов
/ 10 марта 2009

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

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

0 голосов
/ 10 марта 2009

Как я уже сказал в своем ответе на ваш предыдущий вопрос:

Используйте Перенаправление сборки инструкции в вашем app.config или machine.config.

...