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

Visual studio NuGet包包含与另一个包中的程序集同名的程序集,visual-studio,visual-studio-2013,nuget,monogame,opentk,Visual Studio,Visual Studio 2013,Nuget,Monogame,Opentk,在VisualStudio2013中,我有一个项目同时依赖于MonoGame.Binaries NuGet包和OpenTK.GLControl包。OpenTK.GLControl包本身依赖于OpenTK包 二进制文件包含自己的OpenTK.dll副本,而不依赖于OpenTK包。因此,该OpenTK.dll将在生成时覆盖输出文件夹中OpenTK包中的OpenTK.dll。这会破坏应用程序,因为OpenTK.GLControl需要包提供的不同版本的OpenTK,而不是MonoGame.Binarie

在VisualStudio2013中,我有一个项目同时依赖于MonoGame.Binaries NuGet包和OpenTK.GLControl包。OpenTK.GLControl包本身依赖于OpenTK包

二进制文件包含自己的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>

..\packages\OpenTK.1.1.1589.5942\lib\NET40\OpenTK.dll
假的
..\packages\OpenTK.GLControl.1.1.1589.5942\lib\NET40\OpenTK.GLControl.dll
此项目引用此计算机上缺少的NuGet包。启用NuGet软件包还原以下载它们。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkID=322105. 缺少的文件是{0}。

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>

$(MSBuildThisFileDirectory)\OpenTK.dll
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软件包,而不包括自己的软件包。

我想最近安装的软件包将覆盖dll。直到你将这两个DLL都安装到GAC。我尝试卸载,然后确保先重新安装MonoGame.Binaries,然后是OpenTK.GLControl。OpenTK.dll和MonoGame似乎没有什么区别。二进制文件在构建过程中继续“获胜”。请发布您的csproj内部文件,特别是引用。添加到原始帖子中的相关位。在包含目标文件后,我是否可以向.csproj文件中添加任何内容,以编程方式删除该引用,以便包还原不会消除更改?最简单的方法可能是从项目文件中删除MonoGame.Binaries.targets导入,然后然后将对MonoGame.Framework.dll和Tao.Sdl.dll的引用添加到您的项目中。虽然如果你这样做,那么你真的没有使用MonoGame.Binaries NuGet包,除了它提供DLL。