2014-12-14 2 views
1

Visual Studio 2013에는 MonoGame.Binaries NuGet 패키지와 OpenTK.GLControl 패키지에 의존하는 프로젝트가 있습니다. OpenTK.GLControl 패키지 자체는 OpenTK 패키지에 의존합니다.NuGet 패키지에는 다른 패키지의 어셈블리와 같은 이름의 어셈블리가 포함되어 있습니다.

MonoGame.Binaries에는 OpenTK 패키지 대신 OpenTK.dll 복사본이 포함되어 있습니다. 결과적으로 OpenTK.dll은 OpenTK 패키지의 OpenTK.dll을 빌드시 출력 폴더에 덮어 씁니다. OpenTK.GLControl은 MonoGame.Binaries가 제공하는 어셈블리의 버전이 아닌 패키지가 제공하는 OpenTK의 다른 버전을 필요로하기 때문에이 응용 프로그램이 손상됩니다.

두 가지 종속성을 모두 사용하여 좋은 결과를 얻고 적어도 필요한 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

가장 최근에 설치 한 것이 dll을 덮어 쓸 것이라고 가정합니다. 두 dll을 모두 GAC에 설치할 때까지. – abatishchev

+0

제거를 시도한 다음 MonoGame.Binaries를 다시 설치하고 OpenTK.GLControl을 먼저 설치해야합니다. MonoGame.Binaries의 OpenTK.dll이 빌드에서 "이기기"를 계속합니다. – Mars

+0

특히 csproj 내부 자료, 참고 자료를 게시하십시오. – abatishchev

답변

1

MonoGame.Binaries NuGet 패키지가 프로젝트에 추가하는 자사의 MonoGame.Binaries.targets에서 OpenTK.dll에 대한 참조를 추가합니다. 이 .targets 파일은 패키지 중 하나에 있습니다. \ 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 패키지를 사용하고 자체 패키지를 포함하지 않는 것이 가장 좋은 해결책이라고 생각합니다.

+0

패키지 복원이 변경 내용을 지우지 않도록 대상 파일이 포함 된 후에 해당 참조를 프로그래밍 방식으로 제거하려면 .csproj 파일에 추가 할 수있는 것이 있습니까? – Mars

+0

가장 간단한 방법은 프로젝트 파일에서 MonoGame.Binaries.targets 가져 오기를 제거한 다음 MonoGame.Framework.dll 및 Tao.Sdl.dll에 대한 참조를 프로젝트에 직접 추가하는 것입니다. 비록 당신이 그것을하고있다면 당신은 정말로 dll을 제공하는 것 이외에 MonoGame.Binaries NuGet 패키지를 사용하지 않고 있습니다. –

관련 문제