NuGet包中包含与另一个包中的程序集同名的程序集

时间:2014-12-14 05:01:23

标签: visual-studio visual-studio-2013 nuget monogame opentk

在Visual Studio 2013中,我有一个项目,它依赖于MonoGame.Binaries NuGet包和OpenTK.GLControl包。 OpenTK.GLControl包本身依赖于OpenTK包。

MonoGame.Binaries包含自己的OpenTK.dll副本,而不是依赖于OpenTK包。因此,OpenTK.dll将从构建时的输出文件夹中的OpenTK包中覆盖OpenTK.dll。这打破了应用程序,因为OpenTK.GLControl需要包提供的不同版本的OpenTK,而不是MonoGame.Binaries提供的任何版本的程序集。

我怎样才能让两个依赖项互相玩得很好,至少只使用自己的OpenTK.dll副本,如果这就是他们需要的那样?

以下是涉及引用的.csproj部分:

<ItemGroup>
    <Reference Include="OpenTK, Version=1.1.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
      <HintPath>..\packages\OpenTK.1.1.1589.5942\lib\NET40\OpenTK.dll</HintPath>
    </Reference>
    <Reference Include="OpenTK.GLControl, Version=1.1.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\packages\OpenTK.GLControl.1.1.1589.5942\lib\NET40\OpenTK.GLControl.dll</HintPath>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Drawing" />
    <Reference Include="System.Windows.Forms" />
  </ItemGroup>
  <ItemGroup />
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Import Project="..\packages\MonoGame.Binaries.3.2.0\build\net40\MonoGame.Binaries.targets" Condition="Exists('..\packages\MonoGame.Binaries.3.2.0\build\net40\MonoGame.Binaries.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('..\packages\MonoGame.Binaries.3.2.0\build\net40\MonoGame.Binaries.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MonoGame.Binaries.3.2.0\build\net40\MonoGame.Binaries.targets'))" />
  </Target>

1 个答案:

答案 0 :(得分:1)

MonoGame.Binaries NuGet包从其添加到项目中的MonoGame.Binaries.targets中添加对OpenTK.dll的引用。此.targets文件位于 packages \ MonoGame.Binaries.3.2.0 \ build 子目录之一,具体取决于项目的目标框架,在您的情况下为net40。

如果从MonoGame.Binaries.targets文件中删除以下部分,则OpenTK NuGet包中的OpenTK.dll将被复制到您的bin目录。

<Reference Include="OpenTK">
  <HintPath>$(MSBuildThisFileDirectory)\OpenTK.dll</HintPath>
</Reference>

MonoGame.Binaries引用的OpenTK的汇编版本为1.1,汇编文件版本为1.1.940.3125。使用1.1的汇编版本表明它们是兼容的,但你必须测试你的应用程序是否仍然可以使用不同版本的OpenTK.dll与MonoGame一起使用。如果MonoGame.Binaries仅适用于它包含的OpenTK版本,则必须删除OpenTK.Control和OpenTK NuGet包,并找到OpenTK.Control的兼容版本。

我认为最好的解决办法是让MonoGame.Binaries NuGet包使用OpenTK NuGet包而不包含它自己的包。