У меня есть библиотека классов с открытым исходным кодом, предназначенная для 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. Поскольку это проект с открытым исходным кодом, над которым работают десятки разработчиков, мне нужно предоставить решение, которое будет работать независимо от того, установлено обновление или нет.
Я уже изучил всю информацию в следующих сообщениях:
- Обновление Windows привело к тому, что MVC3 и MVC4 перестали работать
- System.Web.Mvc не работает должным образом после Центра обновления Windows
- Исправление безопасности ASP.NET MVC до версии 3.0.0.1 ломает сборку
- http://blogs.msdn.com/b/webdev/archive/2014/10/16/microsoft-asp-net-mvc-security-update-broke-my-build.aspx
В соответствии с приведенной выше конфигурацией я уже пытался перейти от ссылки 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, а также на компьютерах, на которых он не установлен?