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

75

我很想开始使用.NET Core,并逐步将应用程序和库迁移到它上面。但是,我无法真实地升级整个代码库以使用.NET Core,然后进行测试并在生产环境中部署大量应用程序。

例如,如果我创建一个新的.NET Core应用程序并尝试引用我的.NET Framework项目,则会出现以下情况:

以下项目不支持作为引用:- Foobar.NetFramework有目标框架与当前项目Foobar.NetCore中的目标不兼容。

Foobar.NetCore: .NETCoreApp,版本=v1.0

Foobar.NetFramework:.NETFramework,版本=v4.5

是否可以创建一个新的.NET Core应用程序并引用我的现有.NET Framework库? 如果可以,那么如何进行该过程? 我花了几个小时查看了微软的文档并搜索了他们在GitHub上的问题,但我找不到任何官方文件来说明如何实现这一点或者他们对此过程的长期愿景是什么。


这个问题可能对你有所帮助:http://stackoverflow.com/questions/39041097/how-do-i-add-the-npoi-library-to-a-net-core-1-0-project/39041098#39041098 - AperioOculus
3
@CamiloTerevinto,有没有最新消息表明它可以使用 .Net 5 来完成? - beppe9000
你需要将你的库移植到 .Net Standard。你可以使用 https://dotnet.microsoft.com/en-us/platform/upgrade-assistant 来查找更详细的信息。 - r2018
4个回答

34

虽然这是一个老问题,但随着.NetStandard 2.0、.netcore 2.0和vs2017.3的发布,情况已经改变了。

你可以在.NetCore2项目中使用完整的.NET框架(TFM),但是如何操作呢?

  1. 在Visual Studio 2017.3中,你可以直接从.NetCore2项目中引用任何版本的完整.NET框架。

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

例如,引用json.net net45从.NetStandard2中。浏览到该文件夹并选择版本net45(而不是netstandard1.3)。

请参见下面的图片依赖项,没有黄色警告。

enter image description here

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

引用.NET Core 2/Standard 2.0公告并附上链接:

.NET Core 2.0可以自由引用已构建为.NET Framework版本4.6.1以下的库。

但是,如果它们尝试使用在.NET Core上不可用的API方法,则某些库可能在运行时失败。

参考资料:.NET Core应用程序在Linux上的目标.NET framework 4.5.2

需要使用第三方.NET库或NuGet包而这些库或NuGet包不适用于.NET Standard/.NET Core

因此,只有在库或NuGet包使用.NET Standard/.NET Core中不可用的技术时,您才需要使用.NET Framework。

参考资料:选择哪个.NET框架用于服务器应用程序

现在,您可以使用Visual Studio 2017 15.3从.NET Standard库引用.NET Framework库。该功能帮助您随着时间的推移将.NET Framework代码迁移到.NET Standard或.NET Core(从二进制文件开始,然后转向源代码)。在.NET Framework库的源代码不再可用或丢失的情况下,该功能也非常有用,使它仍然可以在新场景中使用。

参考资料:宣布 .NET Core 2.0


17

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

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

提示:您可能需要更改.NET Core或旧项目的框架才能实现此操作。只需像上面所示编辑project.json文件即可更改.NET Core。在.NET项目中,右键单击该项目并打开属性也可以进行相同的操作。在那里更改框架级别。

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


9
为了更清楚明确,我认为需要强调一下,这里是在完整的.NET Framework上运行ASP.NET Core,而不是在所谓的.NET Core上运行ASP.NET Core。.NET Framework和.NET Core之间的区别很重要,因为前者是在我们过去使用的最新版本的ASP.NET上运行,而后者则是在跨平台的较小的.NET组件上运行。 - Brad Rem
2
当我尝试将依赖项添加到project.json文件中时,我会得到以下错误提示:无法解析“.NETFramework,Version = v4.6”所需的“My.Test.Project(>= 1.0.0)”。如果项目不是NuGet包,则可能会出现此问题。 - Justin Helgerson
@JustinHelgerson,如果你正在使用Visual Studio,尝试像以前一样添加它:点击“引用”项,然后选择“添加引用”。IDE将为你在project.json中创建条目。如果你的框架项目是.net46,它应该放在net46下面。 - Brad Rem
2
@JustinHelgerson 我创建了一个 Github 仓库,AspNetCoreWithFrameworkLibrary,演示了将 Framework 库添加到 Asp.Net Core Web 应用程序的基础知识。 - Brad Rem
@aholtry,当我更改框架时,它似乎无法工作,显示错误。我创建了一个新的.NET Framework Core应用程序,但它也无法添加引用。 - LittleDragon
显示剩余4条评论

10
我们尽可能地推迟了迁移,因为一开始似乎很困难。但是我们有一个坚持要立即迁移的客户。
因此,我们将他们开发在.NET Framework 4.8 Web Forms上的Fintech Web App迁移到了.NET 6 Razor Page上。在启动项目之前,我们的团队查看了数百个在线资源并与Microsoft Tech Support交谈。希望我们的项目概览可以帮助您计划迁移。
我们的.NET Framework网站由1个.NET Web Forms项目和12个类库组成。
这是我们的操作步骤:
1. 重构.NET Framework 4.8 Web Forms代码
我们确保Web Forms后面的代码没有任何一行服务或业务逻辑代码。当我们在Web Forms中找到一些业务逻辑代码时,我们通过将其移至类库来进行重构。
2. 创建新的.NET Standard项目
我们为每个.NET Framework 4.8类库创建了一个新的.Standard 2.0类库项目。如果原始项目的名称为"FintechProjectName.StockMarketClient",我们将.NET标准项目命名为"FintechProjectName.StockMarketClient.Standard"。
3. 将所有文件从.NET Framework复制到.NET Standard
我们将所有类文件从.NET Framework复制到.NET标准项目。然后,我们删除了解决方案中的所有.NET Framework类库,并添加了对新类库的引用。所有项目都在第一次编译时通过,所有测试用例也都通过了,只需要做一些小修改。
4. 创建新的.NET 6 Web App项目
我们创建了一个新的.NET 6 Web App项目。由于没有将Web Forms直接迁移到Razor Pages的直接路径,因此我们必须完全重新制作前端。这是唯一一个花费我们约1个月时间进行迁移的项目。
5. 在新的.NET 6网站中引用.NET标准类库
我们将所有.NET标准库复制到包含Razor Pages网站的新解决方案中。添加了这些引用并使其正常工作。
6. 从.NET Standard移动到.NET 6类库
一旦新网站正常运行,并通过了所有测试用例,我们进行了最后一步 - 创建每个.NET标准库的.NET 6类库项目,并适当地命名项目。将所有类文件从.NET标准项目复制到相应的.NET 6项目中。然后,我们删除了.NET标准库,并添加了对新类库的引用。
总体项目时间大约为一个半月,其中大部分时间都是用于使用相同的HTML设计实施Razor Pages。

注意: 如果您正在使用任何没有 .NET Standard 或 .NET 5 版本的第三方库,那么您将需要寻找替代的 NuGet 包并重新编写应用程序以使用这个新库。


在我的情况下,我能够创建一个4.8框架的WinForms项目,并以添加项目引用的正常方式从我的.NET 6项目中引用它。 - Kirsten
这个评论对于一个命令和复杂的问题充满了有用的智慧。我很遗憾看到它没有得到更多的关注。感谢您抽出时间写下您经验的精华。 - Daniel

0
在我的情况下,使用 .net6 引用框架 4.8 库(包括 winforms),诀窍似乎是将框架 dll 的引用添加为共享引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接