Предположим, у вас есть следующая структура проекта:
![Project Diagram](https://i.imgur.com/mT9GyfE.png)
... где 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 являются необязательными, но вы можете использовать их, если вам нужен диапазон ревизий для этого применения.)