如何在 .NET Core 项目中引用 .NET Framework 项目?

How do I reference a .NET Framework project in a .NET Core project?

我真的很想开始使用 .NET Core 并慢慢将应用程序和库迁移到它。但是,我无法现实地升级我的整个代码库以使用 .NET Core,然后在生产中经历测试和部署大量应用程序的过程。

例如,如果我创建一个新的 .NET Core 应用程序并尝试引用我的一个 .NET Framework 项目,我会得到以下信息:

The following projects are not supported as references: - Foobar.NetFramework has target frameworks that are incompatible with targets in current project Foobar.NetCore.

Foobar.NetCore: .NETCoreApp,Version=v1.0

Foobar.NetFramework: .NETFramework,Version=v4.5

是否可以创建新的 .NET Core 应用程序并引用我现有的 .NET Framework 库?如果是这样,这样做的过程是什么?我花了几个小时浏览 Microsoft 的文档并在 GitHub 上搜索他们的问题,但我找不到任何关于如何实现这一目标或他们对此过程的长期愿景的官方信息。

是的,我们目前正在尝试同样的事情。诀窍是确保您支持相同的 .NET 框架。在您的 project.json 文件中,确保框架与您希望包含的项目的框架相匹配。例如:

"frameworks": {
    "net46": {  --This line here <<<<
      "dependencies": {
        "DomainModel": {
          "target": "project"
        },
        "Models": {
          "target": "project"
        }
      }
    }
  },

仅供参考:您可能需要更改 .NET Core 或旧项目的框架才能实现此目的。 .NET Core 可以通过编辑 project.json 文件来更改,如上所示。您可以通过右键单击项目并打开属性在 .NET 项目中执行相同的操作。在那里更改框架级别。

一旦您匹配了两个项目框架,您就应该能够包含它们。祝你好运!

老问题,但是随着 .NetStandard 2.0 和 .netcore 2.0 以及 vs2017.3 的发布,游戏发生了变化。

您可以将完整的 .NET Framework (TFM) 与 .NetCore 2.0 一起使用,但是如何使用?

  1. 在 Visual Studio 2017.3 中,您可以直接从 .NetCore2 项目中引用完整的 .NET Framework(任何版本)。

  2. 您可以构建 .NetStandard2 class 库并引用您的 TFM。然后从您的 .NetCore2 项目中引用您的 .NetStandard2 库。

例如,从 .NetStandard2 引用 json.net net45。 浏览到文件夹和 select 版本 net45(不是 netstandard1.3)

查看下图中的依赖项,没有黄色警告。

  1. 即使 Nuget 库尚未准备好移植到 .Netstandard 2,您也可以使用任何 API 符合 net461 的库。

引用带有链接的 .NET Core 2/Standard 2.0 公告:

.NET Core 2.0 is able to freely reference libraries that have been built for .NET Framework up to version 4.6.1

However, some libraries may fail at run time if they try to use API methods that aren't available on .NET Core

参考:.NET Core App target .NET framework 4.5.2 on Linux

A need to use third-party .NET libraries or NuGet packages not available for .NET Core

So only in cases where the libraries or NuGet packages use technologies that aren't available in .NET Standard/.NET Core, you need to use the .NET Framework.

参考:Choosing between .NET Core and .NET Framework for server apps

You can now reference .NET Framework libraries from .NET Standard libraries using Visual Studio 2017 15.3. This feature helps you migrate .NET Framework code to .NET Standard or .NET Core over time (start with binaries and then move to source). It is also useful in the case that the source code is no longer accessible or is lost for a .NET Framework library, enabling it to be still be used in new scenarios.

参考:Announcing .NET Core 2.0

在我使用 .net6 引用框架 4.8 库(两个 winforms)的情况下,诀窍似乎是将对框架 dll 的引用添加为 shared 引用。

我们尽可能地推迟了迁移,因为它一开始看起来令人生畏。但是我们有一个坚持要尽快迁移的客户。

因此,我们将他们在 .NET Framework 4.8 Web Forms 上开发的 Fintech Web App 迁移到了 .NET 6 Razor Page。在我们开始该项目之前,我们的团队搜索了数百个在线资源并与 Microsoft 技术支持部门进行了交谈。希望我们旅程的 high-level 演练能帮助您规划迁移。

我们的 .NET Framework 网站由 1 个 .NET Web Forms 项目和 12 个 Class 库组成。

我们是这样做的。

  • 重构了 .NET Framework 4.8 Web Forms 代码 我们确保后面的 Web Forms 代码没有一行服务或业务逻辑代码。当我们确实在 Web 表单代码背后找到一些业务逻辑代码时,我们通过将其移动到 class 库来重构它。

  • 创建了新的 .NET Standard 项目 我们为每个 .NET Framework 4.8 Class 库创建了一个新的 .Standard 2.0 Class 库项目。如果原始项目名为“FintechProjectName.StockMarketClient”,我们将 .NET 标准项目命名为“FintechProjectName.StockMarketClient.Standard”。

  • 已将所有文件从 .NET 框架复制到 .NET 标准 我们将所有 class 文件从 .NET 框架复制到 .NET 标准项目。然后,我们从解决方案中删除了所有 .NET 框架 class 库,并添加了对新 class 库的引用。所有在 1 日编译的项目都进行了自我尝试,我们所有的测试用例也通过了微小的更改。

  • 创建新的 .NET 6 Web 应用程序项目 我们创建了一个新的 .NET 6 Web App 项目。我们不得不完全重做 front-end,因为没有将 Web 窗体迁移到 Razor Pages 的直接路径。这是唯一一个花了我们大约 1 个月的时间来迁移的项目。

  • 参考 .NET 标准 class 新 .NET 6 网站中的库 我们将所有 .NET Standard 库复制到这个包含 Razor Pages 网站的新解决方案。添加了参考资料并使其正常工作。

  • 从 .NET Standard 迁移到 .NET 6 class 库 一旦新网站启动并且运行,所有测试用例都通过了,我们就完成了流程中最简单的最后一步。为每个 .NET 标准库创建了 .NET 6 class 库项目,并适当地命名了这些项目。将所有 class 文件从 .NET 标准项目复制到它们对应的 .NET 6 项目。然后我们删除了 .NET Standard 库并添加了对新 class 库的引用。

整个项目的时间线大约为一个半月,其中大部分时间用于使用相同 html 设计的 Razor Pages 实施。

注: 如果您使用的是任何没有 .NET 标准或 .NET 5 版本的第三方库,那么您就不走运了。您将需要找到一个替换 nuget 包并重新编码您的应用程序以使用这个新库。