我已经在MVC5中创建了一个组件( DLL ),DLL也包含了编译视图。当我在MVC5项目中访问这个DLL时,我能够调用控制器,这个MVC5的动作DLL,但是当我在MVC4项目中访问它时,我收到404错误。
是否可以在MVC 4项目中访问MVC5 DLL?
答案 0 :(得分:1)
直接无法实现dll不向后兼容。
但是你有MVC5 dll&s并且希望在MVC4上运行的旧项目中使用它们。
然后你需要将你的Project升级到MVC5才能使用dll&#39>
您可以在提供的链接上找到完整的参考资料:
How to Upgrade an ASP.NET MVC 4 and Web API Project to ASP.NET MVC 5 and Web API 2
升级后,您可以在项目中使用这些dll。
答案 1 :(得分:0)
一种可能的解决方法是为.csproj
文件添加条件,这样就可以为MVC 4编译一个版本,为MVC 5编译一个版本。它有点参与,但是如果你想支持两个版本的MVC它可能是你的选择。
<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>
<ItemGroup Condition=" $(DefineConstants.Contains('MVC5')) ">
<Reference Include="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.Mvc.5.0.0\lib\net45\System.Web.Mvc.dll</HintPath>
</Reference>
<Reference Include="System.Web.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.Razor.3.0.0\lib\net45\System.Web.Razor.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.3.0.0\lib\net45\System.Web.WebPages.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.3.0.0\lib\net45\System.Web.WebPages.Razor.dll</HintPath>
</Reference>
</ItemGroup>
然后我们在编译之前在DefineConstants(可以在项目属性的Build选项卡上访问)中设置MVC4或MVC5。
<DefineConstants Condition=" '$(DefineConstants)' == '' ">MVC4;NET40;</DefineConstants>
请注意,此设置也可以通过构建脚本进行更改。
我们在MvcSiteMapProvider项目上使用这种技术,效果很好。不幸的是,NuGet也不支持多个版本的MVC,因此我们不得不为每个主要版本的MVC制作一个软件包。
将多个版本的MVC NuGet包放入项目中也有点棘手。我们只创建一个单独的临时项目,安装一个特定的MVC主要版本,然后将NuGet \packages\
文件和packages.config
中的条目复制到这个项目中(沿着一个或多个不同版本的MVC) )。以这种方式放置它们可确保在CI服务器上下载所有版本的MVC。虽然Visual Studio在切换MVC版本时没有正确显示依赖关系,但构建项目效果很好。