如何在 mvc 中创建具有多版本支持的解决方案

Posted

技术标签:

【中文标题】如何在 mvc 中创建具有多版本支持的解决方案【英文标题】:How to create solution with multiple version support in mvc 【发布时间】:2019-10-02 06:53:00 【问题描述】:

我正在 Asp.net MVC 4.7.1 最新版本中创建一个项目,并希望在其他项目中也将该解决方案作为类库 dll 重用。但我们使用此 dll 的其他项目不支持最新版本(4.6)。当我尝试在其他版本的解决方案中使用类库时,它会抛出以下错误。

(0): 错误 CS1705: 程序集 'ProjectName(dll name), Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 使用 'System.Web.Mvc, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 的版本高于引用的程序集 'System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

我需要创建一个支持多版本的解决方案,同时将其用作 dll。

【问题讨论】:

【参考方案1】:

您需要在项目中定位多个框架;

    右键单击项目名称,然后单击“编辑 .cproj 文件” 将 (s) 添加到目标框架标签,使其变为
<TargetFrameworks>...</TargetFrameworks>
    指定您的目标框架(所有版本请参见docs):
<TargetFrameworks>net472;net48;netcoreapp2.0;netcoreapp2.1;netcoreapp2.2</TargetFrameworks>
    如果您的库有任何引用,您需要手动指定每个版本的所有引用:
<ItemGroup Condition=" '$(TargetFramework)' == 'net471' ">
  <Reference Include="System.Net" />
</ItemGroup>

或为多个版本指定参考:

<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.0' || '$(TargetFramework)' == 'netcoreapp2.1' || '$(TargetFramework)' == 'netcoreapp2.2' ">
  <PackageReference Include="Microsoft.AspNetCore.Mvc.TagHelpers" Version="1.0.0" />
</ItemGroup>

或为所有目标框架指定包引用:

<ItemGroup>
  <PackageReference Include="Microsoft.AspNetCore.Localization" Version="1.0.0" />
</ItemGroup>

您可以指定所需的最低版本,框架将安装最新的兼容版本。例如下面我们将本地化包最小版本指定为 1.0.0,但是当它安装在 .Net Core 2.2 上时,它将安装最新的兼容版本,有关版本控制的更多详细信息,请参阅version ranges and wild chars

    最后但并非最不重要的;在您的代码中,您需要检查目标框架的特定情况,您需要在每个版本中使用兼容的代码行。

例如,要获取文化信息,您需要为不同的 .Net Core 版本指定不同的代码:

#if NETCOREAPP1_0
    var culture = new CultureInfo("en-US");
#else
    var culture = CultureInfo.GetCultureInfo("en-US");
#endif

    _logger.LogInformation($"culture.Name");

如果您使用的是 Visual Studio,您将看到所有目标框架的下拉导航,您可以使用它在目标框架之间切换并检查您的代码兼容性。

【讨论】:

我已经尝试过您提到的建议。但没有运气。我已将代码更新如下 Here我们已经提到了目标框架条件。我的场景是目标框架是 4.6,源 dll 是 4.7.1。我的目标在版本 5.2.3.0 中有 system.web.mvc 文件,而我试图将 4.6 框架项目的 system.web.mvc 引用为 5.2.4.0 您可以在问题中添加您的 .csproj 文件吗? 我不能所有的代码...这是一个大项目 False..\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dllTrue 这样你就可以引用被引用的 MVC 的早期版本,see all available versions here

以上是关于如何在 mvc 中创建具有多版本支持的解决方案的主要内容,如果未能解决你的问题,请参考以下文章

在 MVC 中创建具有上下文的控制器时如何省略视图的生成?

如何在 Intellij IDEA 13.1 中创建具有 Maven 结构的 Spring MVC 应用程序?

从 ASP.NET MVC 迁移到 ASP.NET Core MVC

在 VoltRb 中创建具有特定版本的新项目

如何在 Spring MVC 中的不同类中创建动态 bean

如何从单个数据框中创建具有不同内容的多个 PDF?