【问题标题】:NuGet package contains assembly with the same name as an assembly in another packageNuGet 包包含与另一个包中的程序集同名的程序集
【发布时间】:2015-02-12 12:20:14
【问题描述】:

在 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>

【问题讨论】:

  • 我想最近安装的会覆盖 dll。直到您将两个 dll 都安装到 GAC。
  • 我尝试卸载,然后确保先重新安装 MonoGame.Binaries,然后再安装 OpenTK.GLControl。似乎没有什么不同,来自 MonoGame.Binaries 的 OpenTK.dll 在构建时继续“获胜”。
  • 请发布您的 csproj 内部资料,特别是参考资料。
  • 原帖中添加了相关位。

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


【解决方案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 包而不包含它自己的包。

【讨论】:

  • 在包含目标文件后,我可以在我的 .csproj 文件中添加任何内容以通过编程方式删除该引用,以便包还原不会消除更改吗?
  • 最简单的做法可能是从您的项目文件中删除 MonoGame.Binaries.targets 导入,然后自己将 MonoGame.Framework.dll 和 Tao.Sdl.dll 的引用添加到您的项目中。虽然如果你这样做,那么你真的没有使用 MonoGame.Binaries NuGet 包,除了它提供 dll。
猜你喜欢
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 2023-03-06
  • 2016-04-05
  • 2020-06-07
相关资源
最近更新 更多