Using multiple versions of the same DLL

Почти все о лицензировании.Net объяснено здесь . Никакая потребность переписать, я думаю.

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

Hope это помогает.

26
задан Shaamaan 6 May 2011 в 20:47
поделиться

2 ответа

Вы также можете рассчитывать на перенаправление привязки сборки для сборки со строгим именем, как описано в http://msdn.microsoft.com/en-us/library/2fc472t2.aspx .

У вас будет только одна версия файла (самая последняя), и обе ссылки разрешат его.

1
ответ дан 28 November 2019 в 07:24
поделиться

Предположим, у вас есть следующая структура проекта:

Project Diagram

... где A и B - библиотеки классов, а C это проект исполняемого типа (например, модульное тестирование или консольный проект).

Давайте предположим, что структура папок выглядит следующим образом:

ABC.sln
A/A.csproj
A/...
B/B.csproj
B/...
C/C.csproj
C/...
lib/thirdparty4/thirdparty.dll
lib/thirdparty5/thirdparty.dll

Если бы мы попытались наивно ссылаться на наши проекты вместе, у нас возникла бы проблема: две версии thirdparty.dll будут скопированы в ту же папку (выходной каталог (т. е. bin) каталога C). Нам нужен способ для C скопировать обе библиотеки в свой выходной каталог и предоставить механизм для ссылки на любую из них.

Чтобы решить эту проблему, я изменил C.csproj так, чтобы он содержал следующее:

<ItemGroup>
  <Content Include="..\lib\thirdparty4\thirdparty.dll">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <Link>thirdparty4\thirdparty.dll</Link>
  </Content>
  <Content Include="..\lib\thirdparty5\thirdparty.dll">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <Link>thirdparty5\thirdparty.dll</Link>
  </Content>
</ItemGroup>

Это даст ему указание создать thirdparty4\thirdparty.dll и thirdparty5\thirdparty.dll в его выходном каталоге.

Теперь, после сборки C, его выходной каталог выглядит следующим образом:

C\bin\Debug\A.dll
C\bin\Debug\B.dll
C\bin\Debug\C.dll
C\bin\Debug\thirdparty4\thirdparty.dll
C\bin\Debug\thirdparty5\thirdparty.dll

Чтобы поручить C использовать оба этих dll, я добавил файл App.config в это со следующим:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="thirdparty" culture="neutral" publicKeyToken="1234567890123445"/>
        <bindingRedirect oldVersion="4.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
        <codeBase version="4.0.0.0" href="thirdparty4\thirdparty.dll" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="thirdparty" culture="neutral" publicKeyToken="1234567890123445"/>
        <bindingRedirect oldVersion="5.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
        <codeBase version="5.0.0.0" href="thirdparty5\thirdparty.dll" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

Это даст указание сборке, в зависимости от того, какая версия требуется, использовать одну DLL или другую, обе из которых будут доступны в подпапках выходного каталога. (Элементы bindingRedirect являются необязательными, но вы можете использовать их, если вам нужен диапазон ревизий для этого применения.)

14
ответ дан 28 November 2019 в 07:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: