假设你有一个项目结构如下:
![Project Diagram](https://istack.dev59.com/m3Txv.webp)
...其中
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将被复制到同一个文件夹(即C的输出(即bin)目录)。我们需要一种方法让C将两个dll都复制到其输出目录,并提供一个引用其中任意一个的机制。
为了解决这个问题,我修改了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或另一个DLL,这两个DLL都将在输出目录的子文件夹中可用。(
bindingRedirect元素是可选的,但如果您需要适用于一系列修订版本,可以使用它们。)
Newtonsoft.Json.dll
和Newtonsoft.Json.12.dll
),则程序集也可以放在相同的输出目录中,但具有不同的名称。 - user2864740