2

我有一個開放源代碼的類庫,目標爲MVC 2,3,4和5.我爲每個版本使用相同的項目文件,並使用編譯常量在項目參考如下。Windows更新MS14059 Broke MVC 3類庫項目中的參考

<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 refe改變繼續使用NuGet包。但是,如果我嘗試在沒有安裝此更新的計算機(包括不受我直接控制的構建服務器)上構建,那不起作用。使用原始配置不再構建在安裝了Windows Update的計算機上。在安裝了更新的計算機上使用新的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> 

是否有沒有任何可以用來做一個類庫引用對已在Windows Update MS14059安裝以及機器的機器MVC 3編譯上面的引用文件的任何其他選項,沒有安裝它?

回答

2

到目前爲止,我所提出的解決方案是有條件地包含正確的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>