是否可以让 ASP.NET Core 解决方案包含具有不同目标框架的项目?

Posted

技术标签:

【中文标题】是否可以让 ASP.NET Core 解决方案包含具有不同目标框架的项目?【英文标题】:Is it possible to have an ASP.NET Core solution contain projects with different target frameworks? 【发布时间】:2018-09-06 18:37:35 【问题描述】:

像这样:

一个解决方案(我认为这一定是 ASP.NET Core?)

项目1.目标框架为.NET Core 2.1 项目 2。目标框架是 .NET Framework 4.5.1。处理数据访问的类库。我问的原因是项目 2 包含我们目前没有时间迁移的遗留依赖项。

【问题讨论】:

“解决方案”没有目标框架的概念。它只是一个方便的项目文件列表。你是说 Project1 会引用 Project2? 是的。项目 1 将引用项目 2。 据此看来是可以的:***.com/questions/47874095/… 【参考方案1】:

该解决方案与使用的目标框架无关。目标框架适用于项目,因此您可以让每个项目针对解决方案中的不同目标,从解决方案的角度来看,蹲下并不重要。

当你有项目依赖时,问题就出现了。为了依赖于针对不同框架的项目,所使用的所有框架必须以某种方式相互兼容。例如,您可以从 .NET 4.7 项目中引用 .NET 4.6 项目,因为最终 .NET 4.7 是 4.6 的超集。

更直接地谈到 .NET Core 和您的场景,不,您不能从 .NET Core 2.1 项目引用 .NET 4.5.1 项目,但是您可以引用 .NET Core 项目。 NET 4.6.1 项目。这里的问题是 .NET Core 处理 .NET Framework 依赖项的能力依赖于 .NET Standard。 .NET Standard 2.0 是第一个支持 .NET Core 和 .NET Framework 之间互操作的版本,至少需要 .NET Core 2.0 和 .NET Framework 4.6.1。如果您可以将该项目定位到至少 4.6.1,那么可以,您可以引用它。

但是,.NET Framework 包含 .NET Standard 不包含的内容,因此也包含 .NET Core 不包含的内容。尽管 Visual Studio 允许您添加引用,但它并不能保证可以实际上使用所有甚至部分库。事实上,添加引用后,您会收到有关此效果的警告。您需要验证依赖项是否正常工作,然后您可以在此时取消警告。

大多数情况下,会让您感到困惑的是特定于平台的 Windows API。例如,System.Drawing 是一个问题,因为 .NET Core 是跨平台的,其中System.Drawing 使用特定于 Windows 的 API。在某些情况下,只要您的应用与 Windows 保持紧密联系,您仍然可以使用这些不兼容的库。再次以System.Drawing 为例,有一个CoreCompat 包允许您在.NET Core 项目中使用System.Drawing,这意味着您可以使用使用System.Drawing 的库,只要您构建并运行在 Windows 上。如果您尝试将您的应用程序带到 Linux,它会崩溃。不过,您可以使用编译器指令在专门针对 Linux 和 Mac 的不同代码中填充以进行补偿。

无论长短,这里没有硬性的“是”或“否”答案。您需要进行一些广泛的测试,以确保一切正常。如果确实出现问题,您也许可以使用 Microsoft 的兼容性包之一来支持,但在替换需要它的代码之前,您将无法离开 Windows。这为您的升级提供了一些喘息的空间,但不要指望您会因为它允许您添加依赖项而获得 .NET Core 的所有承诺和魅力。

【讨论】:

谢谢克里斯!您如何建议从项目 2 访问项目 1 的 appsettings.json 中的值?现在,项目 1 使用 Configuration["Name"],项目 2 使用 ConfigurationManager.AppSettings["Name"]。 关于 System.Drawing,System.Drawing.Commonb 提供了 System.Drawing 的跨平台实现(就像 CoreCompat.System.Drawing 所做的那样)。它在 Linux 和 macOS 上使用 libgdiplus 作为与 GDI+ 兼容的后端,因此不会“崩溃”;它会起作用的。【参考方案2】:

可以,只要您不打算在非 Windows 环境中托管即可。

但是,ASP.NET Core 2.1 应用程序必须目标 .NET Framework 4.6.1 或更高版本虽然仍然可以引用 .NET Framework 4.5.1 类库。

(点击图片全屏查看)

如果要切换目标框架,只需修改.csproj文件即可。

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net461</TargetFramework>
  </PropertyGroup>
</Project>

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>
</Project>

注意:你不能轻易地来回切换。无论何时切换它,都必须恢复 NuGet 包。

第二个选项是 ASP.NET Core 2.1 应用程序目标 .NET Core 2.1 并且仍然引用 .NET框架 4.5.1 类库。

我更喜欢这个选项,因为当您稍后将类库重写为面向 .NET Standard 或 .NET Core 时,您无需对 ASP.NET 应用程序进行任何更改。

【讨论】:

【参考方案3】:

您不需要添加目标框架,您只需将项目作为一个包引用到您的 .Net 核心,方法是将以下内容添加到 .csproj 文件中:

<ItemGroup>
    <Reference Include="MyProjectName">
      <HintPath>path_to_the_project/MyProjectName.dll</HintPath>
    </Reference>
</ItemGroup>

完成后,删除 .Net Core 项目中的 bin 文件夹,恢复包,重建项目,然后就可以开始了。

希望你会发现这很有用。

【讨论】:

以上是关于是否可以让 ASP.NET Core 解决方案包含具有不同目标框架的项目?的主要内容,如果未能解决你的问题,请参考以下文章

我可以让 jQuery 读取 ASP.NET Core 2.1 的标签助手吗?似乎完全无视他们

asp.net core mvc 是否未包含使用UA 动态选择displayModel

ASP.NET与ASP.NET Core用户验证Cookie并存解决方案

c#一个解决方案里包含.netcore3.1和asp.net两个项目,能正常发布iis吗?

使用静态基类方案让 ASP.NET Core 实现遵循 HATEOAS Restful Web API

Asp.net core 3.1 保护 API 和 Web 应用程序