在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>
答案 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包而不包含它自己的包。