我有一个针对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 Update的机器上,而Windows Update也将构建在具有Windows Update的机器上。由于这是一个开源项目,有许多开发人员在构建它,我需要提供一个无论是否安装更新都能正常工作的解决方案。
我已经浏览了以下帖子的所有信息:
根据上面的配置,我已经尝试从GAC参考更改为使用NuGet包。但是,如果我尝试在没有安装此更新的计算机上构建(包括构建服务器,不受我的直接控制),那么这不起作用。使用原始配置不再构建在安装了Windows Update的计算机上。使用新的GAC参考适用于安装了更新的计算机,但不适用于未安装更新的计算机。
我尝试设置copy local属性,但它没有正常工作,因为我引用了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>
是否有任何其他选项不在上述任何引用的文档中,可用于在安装了Windows Update MS14059的计算机上创建引用MVC 3的类库以及不具备这些功能的计算机。安装它?
答案 0 :(得分:2)
到目前为止,我提出的解决方案是有条件地包含正确的MVC程序集,具体取决于GAC中是否存在MVC 3.0.0.0程序集。
<!-- 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>