Центр обновления Windows MS14059 сломал ссылку на MVC 3 в проекте библиотеки классов

У меня есть библиотека классов с открытым исходным кодом, предназначенная для MVC 2, 3, 4 и 5. Я использую один и тот же файл проекта для каждой версии и использую константу компиляции для переключения между ссылками на проект следующим образом.

<ItemGroup Condition=" $(DefineConstants.Contains('MVC3')) ">
    <!--<Reference Include="System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />-->
    <Reference Include="System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.Mvc.3.0.20105.1\lib\net40\System.Web.Mvc.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.Razor.1.0.20105.408\lib\net40\System.Web.Razor.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.WebPages.1.0.20105.408\lib\net40\System.Web.WebPages.Razor.dll</HintPath>
    </Reference>
</ItemGroup>
<ItemGroup Condition=" $(DefineConstants.Contains('MVC4')) ">
    <Reference Include="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.Mvc.4.0.20710.0\lib\net40\System.Web.Mvc.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.Razor.4.0.20715.0\lib\net40\System.Web.Razor.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.WebPages.4.0.20710.0\lib\net40\System.Web.WebPages.Razor.dll</HintPath>
    </Reference>
</ItemGroup>

Ссылки на MVC 4 работают нормально, но я не могу найти конфигурацию MVC 3, которая будет создаваться на компьютерах без Центра обновления Windows, которая также будет создаваться на компьютерах с Центром обновления Windows. Поскольку это проект с открытым исходным кодом, над которым работают десятки разработчиков, мне нужно предоставить решение, которое будет работать независимо от того, установлено обновление или нет.

Я уже изучил всю информацию в следующих сообщениях:

В соответствии с приведенной выше конфигурацией я уже пытался перейти от ссылки GAC к использованию пакета NuGet. Однако это не сработает, если я попытаюсь выполнить сборку на машине, на которой не установлено это обновление (включая сервер сборки, который не находится под моим непосредственным контролем). Использование исходной конфигурации больше не строится на компьютере с установленным Центром обновления Windows. Использование новой ссылки GAC работает на компьютере с установленным обновлением, но не на компьютере, на котором оно не установлено.

Я попытался установить локальное свойство копирования, но оно не работает правильно, поскольку я ссылаюсь на 4 разные версии MVC - установка значения true для одной ссылки снова отключает другие ссылки.

Кроме того, общий консенсус заключается в том, что вы можете решить эту проблему, используя перенаправления привязки сборки. Но поскольку мой проект представляет собой библиотеку классов без собственного файла конфигурации, как бы вы это сделали? Я искал способ перенаправить привязки через атрибуты .NET, но не нашел ничего полезного. Моя DLL не собирается и завершается с ошибкой, аналогичной другим проблемам, о которых я упоминал выше, поэтому бесполезно помещать перенаправления привязки в файл web.config, который физически будет расположен в другом проекте. Я попытался добавить файл app.config в свой проект с переадресацией привязки для MVC 3, но это не сработало.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
                <bindingRedirect oldVersion="3.0.0.0-3.0.0.1" newVersion="3.0.0.1"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>

Существуют ли какие-либо другие параметры, которых нет ни в одном из упомянутых выше документов, которые можно использовать для создания библиотеки классов, ссылающейся на компиляцию MVC 3, на компьютерах с установленным Windows Update MS14059, а также на компьютерах, на которых он не установлен?


person NightOwl888    schedule 02.11.2014    source источник


Ответы (1)


До сих пор я придумал решение, чтобы условно включить правильную сборку MVC в зависимости от того, существует ли сборка MVC 3.0.0.0 в GAC.

<!-- Due to the windows update MS14-059, we need this hack to ensure we can build MVC3 both on machines that have the update and those that don't -->
<Reference 
    Condition=" Exists('$(windir)\Microsoft.NET\assembly\GAC_MSIL\System.Web.Mvc\v4.0_3.0.0.0__31bf3856ad364e35\System.Web.Mvc.dll') "
    Include="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
<Reference 
    Condition=" !Exists('$(windir)\Microsoft.NET\assembly\GAC_MSIL\System.Web.Mvc\v4.0_3.0.0.0__31bf3856ad364e35\System.Web.Mvc.dll') " 
    Include="System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">

    <Private>True</Private>
    <HintPath>..\packages\Microsoft.AspNet.Mvc.3.0.20105.1\lib\net40\System.Web.Mvc.dll</HintPath>
</Reference>
person NightOwl888    schedule 03.11.2014