仅在 Windows 上:net5.0-windows(或 net6.0-windows)是不是允许我在 .Net 5(或 .Net 6)中重新编译 .Net 框架?

Posted

技术标签:

【中文标题】仅在 Windows 上:net5.0-windows(或 net6.0-windows)是不是允许我在 .Net 5(或 .Net 6)中重新编译 .Net 框架?【英文标题】:On Windows only: does net5.0-windows (or net6.0-windows) allow me to recompile .Net framework in .Net 5 ( or .Net 6)?仅在 Windows 上:net5.0-windows(或 net6.0-windows)是否允许我在 .Net 5(或 .Net 6)中重新编译 .Net 框架? 【发布时间】:2021-11-09 04:14:01 【问题描述】:

我有 .Net 框架应用程序,旨在仅在 Windows 上运行,现在和永远。

我正在考虑将它们升级到 .Net 5 或 .Net 6,并将它们定位到 net5.0-windows(或 net6.0-windows)。来自MS website 它说

net5.0-windows 将用于公开 Windows 特定的功能, 包括 Windows 窗体、WPF 和 WinRT API。

这是否意味着我的.Net framework 应用程序可以在.Net 6 中重新编译,只要我指定net-windows 目标并且csproject 升级和编译成功,程序就可以运行我只是想让它们现在和永远都在 Windows 上运行

我的应用程序还消耗大量 .Net 框架 2.0/3.5/4.6 dll(主要与 OpenGL 和其他图形相关),我只能假设没有通用端口到 .Net 5 或 .Net 6 ,并且源代码甚至对我来说都不再可用(它们来自封闭源代码的第三方提供商)。

【问题讨论】:

你读过official documentation吗? @klaus,该文档对 .net5-windows 及其与我的场景的关系没有任何说明。也许您可以更明确地说明它是如何回答我的问题的? 该页面列出了几个tools帮助您检查迁移是否成功 @KlausGütter,根据您提到的工具,我的应用程序很可能会失败,但这是因为这些工具针对的是一般的 .net 6 升级(到任何平台,而不仅仅是 Windows)。我的用例比较有限,我只关心 Windows,我不在乎我的应用程序是否不能在 Linux 上运行。所以我仍然认为该页面与此处无关 @Graviton 文档很清楚,尽管营销宣传混淆了事情。 .NET 5 和 6 是 .NET Core 5 和 6。您不能仅重用 .NET Framework 库或仅重新编译 .NET Framework 项目。您需要将它们迁移到 .NET Core 和新的csproj 格式 【参考方案1】:

这是否意味着我的 .Net 框架应用程序可以在 .Net 6 中重新编译,

是的

程序可以正常工作吗?

很可能会,但应该做一个完整的回归测试来验证。

我的应用还消耗大量 .Net framework 2.0/3.5/4.6 dll

如果您不能迁移到 .Net 4.8,那么能够迁移到 .Net 核心的可能性很小。

(他们大多与 OpenGL 和其他图形相关),我只能假设没有通用端口到 .Net 5 或 .Net 6

每个人都必须根据具体情况进行处理;您可能刚刚回答了您自己的问题。 说晚安格蕾丝...


为您提供更好的服务是创建一个 docker 容器,该容器将为这些应用程序的旧版本提供服务,这些应用程序具有当前工作框架的目标版本。

【讨论】:

使用 docker 容器,如何解决不同 .net 版本之间的相互调用问题? 这些应用程序是否有效?如果它们当前正在运行,具有多种 .Net 风格,则在 docker 容器上重新创建工作操作系统并提供应用程序。 docker 解决方案不是 .Net 5/6 解决方案。要清楚.... :-/ 当移植到 .Net 6 失败时,它是一种替代方法....【参考方案2】:

很遗憾,您的问题没有明确的答案,因为它完全取决于(不是双关语)您的依赖项是什么。

.NET 5 旨在成为经典 .NET Framework 和 .NET Core 的统一体,并且在许多情况下它可以正常工作

从经验来看,在许多情况下,在新框架中创建一个干净的项目,从旧项目中复制所有现有文件,然后重新添加 NuGet 和项目引用,会更容易。我已经成功地为控制台应用程序、测试项目甚至 WinForms 应用程序 15-20 项目对 .NET 4.8 项目的依赖项完成了这项工作,并且它已经开箱即用 - 尽管有一个关于 .NET 4.8 依赖项的编译器警告。

但是,我还遇到了至少一个在 4.8 和 5.0 之间丢失/更改的 API - BeginInvoke。博客文章 here 更详细地描述了它。有时 NuGet 版本也存在问题。

最接近在线最终列表的是MS Doc "Changes that affect compatibility",尤其是Breaking changes for migration from .NET Framework to .NET Core 部分。我不确定这是一个更好的“来自信誉良好的来源的答案”。

至于您的 .NET 2.0 / 3.5 / 4.6 dll,我认为没有尝试就知道。有太多的未知数,特别是因为它们是第 3 方 dll。如果我不得不猜测它至少有一个不起作用,那么您是否可以找到更新版本或者替代库将包含多少工作将无法判断

至于net5.0-windows,基本上就是个软糖。虽然 .NET 5.0 以后的所有目标都是统一和跨平台的,但他们无法及时完成所有工作。我读了一篇关于它的 blob 帖子,我现在找不到,但基本上 WinForms 尤其与一些底层 Windows 专用 API 密切相关。也许是 .NET 7.0?

【讨论】:

您链接到的 Microsoft“从 .NET Framework 迁移到 .NET Core 的重大更改”文档对于 .NET 5 和 6 来说已经完全过时了。 @SimonMourier - 很高兴通过最新链接进行更正 今天还没有。现在一切都是开源的,微软已经严重减少了它的文档投资......而且你关于net5.0-windows的说法很奇怪。 net5.0-windows 仅表示 net5 + Windows-ony 依赖项(winforms、wpf、GDI+ 等)。 我认为微软不会投资于将 Windows 表单和 Windows Presentation Foundation 引入其他平台,所以这个答案中的最后一句话非常奇怪。如前所述,net5.0-windows 是 .NET 5 加上对一些仅限 Windows 的 dll 的访问权限,仅此而已 @CamiloTerevinto 也许这是一厢情愿 - 我一直在尝试并试图找到我读到的关于它的博客文章 - 它以一种听起来像是他们想要解决它们的方式解释了挑战.他们是否想投入足够的资源来实现这一目标以及在什么时间范围内非常有待商榷

以上是关于仅在 Windows 上:net5.0-windows(或 net6.0-windows)是不是允许我在 .Net 5(或 .Net 6)中重新编译 .Net 框架?的主要内容,如果未能解决你的问题,请参考以下文章

图片占位符卡在 iframe 后面(仅在 Windows 机器上)

错误:`#elif with no expression` - 仅在 Windows 上发生

仅在 Windows Mobile/CE 上可用的引用程序集

如何开始学习linux设备驱动开发?(仅在windows上工作)

仅在Windows Server上运行的命令diskshadow

python 生成Chrome书签的html文件(仅在Windows上测试)