【问题标题】:Windows Update MS14059 Broke MVC 3 Reference in Class Library ProjectWindows 更新 MS14059 破坏了类库项目中的 MVC 3 引用
【发布时间】: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 更新的机器上构建。由于这是一个由数十名开发人员构建的开源项目,因此我需要提供一个无论是否安装更新都可以工作的解决方案。

我已经浏览了以下帖子的所有信息:

根据上面的配置,我已经尝试从 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


    【解决方案1】:

    到目前为止,我想出的解决方案是根据 GAC 中是否存在 MVC 3.0.0.0 程序集有条件地包含正确的 MVC 程序集。

    <!-- 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>
    

    【讨论】:

      猜你喜欢
      • 2014-12-12
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      • 2016-10-01
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      相关资源
      最近更新 更多