【发布时间】:2014-12-29 14:03:35
【问题描述】:
我有一个面向 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 update caused MVC3 and MVC4 stop working
- System.Web.Mvc not functioning as expected after Windows Update
- ASP.NET MVC security patch to version 3.0.0.1 breaks build
- 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 文件是没有好处的。我尝试使用 MVC 3 的绑定重定向将 app.config 文件添加到我的项目中,但没有成功。
<?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 的机器以及没有安装的机器上编译安装了吗?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 visual-studio-2012 windows-update