在MVC 4项目中访问MVC5 DLL

时间:2016-05-26 07:35:55

标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

我已经在MVC5中创建了一个组件( DLL ),DLL也包含了编译视图。当我在MVC5项目中访问这个DLL时,我能够调用控制器,这个MVC5的动作DLL,但是当我在MVC4项目中访问它时,我收到404错误。

是否可以在MVC 4项目中访问MVC5 DLL?

2 个答案:

答案 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版本时没有正确显示依赖关系,但构建项目效果很好。