Библиотека DLL в другой папке EXE (относительный путь) - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть windows проект приложения, который строит в исполняемый файл, который использует DLL (RestSharp). Проект находится в Visual Studio 2008. Я добавил библиотеку DLL в разделе «Ссылки» и, если щелкнуть библиотеку DLL, я вижу:

  • псевдонимы: global
  • копировать локально: true
  • speci c версия: false
  • Путь: C: \ Dev \ MyProject \ Lib \ Restsharp.dll

С этими настройками при сборке exe библиотека DLL копируется в каталог сборки. В моей среде развертывания я хотел бы, чтобы мой exe-файл находился в папке, а DLL - в другом. Пример: C: \ Test \ Exe (EXE FOLDER) C: \ Test \ Lib (DLL FOLDER)

Возможно ли это? Как?

Я установил C: \ Test \ Lib в моих ссылочных путях, но это абсолютный путь, я искал относительный путь. Также путь к DLL в References является абсолютным. Что я делаю неправильно? Я бы хотел, чтобы exe-файл "нашел" DLL независимо от того, где она скопирована (C: \ Test или D: \ Test или просто D:)

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

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

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

Во-первых, Это хорошая вещь, чтобы прочитать это: https://docs.microsoft.com/en-us/dotnet/framework/deployment/how-the-runtime-locates-assemblies

где-то в статье это:

Атрибут privatePath элемента, который является пользовательский список подкаталогов в папке root. Это местоположение можно указать в файле конфигурации приложения и в управляемом коде, используя свойство AppDomainSetup.PrivateBinPath для домена приложения.

И мы можем увидеть, как это делается в документах зондирующего тега; https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/probing-element

Добавьте файл app.config в свой проект и отредактируйте его следующим образом:


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

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

  1. Скопировать DLL из выходного каталога в ваш подпуть. Вы можете использовать задачу после сборки и, например, xcopy, чтобы сделать это (Google вокруг этого не должен быть сложным). Вы также можете использовать задачи msbuild для копирования dll
  2. Добавить dll в качестве содержимого в одноименную подпапку в csproj, настроенную для копирования local. Смотрите картинку ниже. enter image description here

Также проверьте соответствующий ответ:

{ ссылка }

Я настоятельно рекомендую вам не надевать не делайте этого, если у вас нет очень веских причин для этого. И в этот момент мне интересно, что это за причина:)

0 голосов
/ 21 апреля 2020

Лучше зарегистрировать эту DLL в GA C, будет использоваться одна DLL из того же пути. Пожалуйста, обратитесь ниже, чтобы узнать https://www.c-sharpcorner.com/UploadFile/dacca2/register-your-assembly-in-gac-using-gacutil-exe/

...