能否从.NET 6使用.NET 4.8库?

9

我需要引用一个专有客户端库,它只能与.NET 4.8一起使用,没有其他选项,这是一个非常狭窄的供应商库,我们必须使用它与.NET 48一起使用。

正在开发的新应用程序是一个服务应用程序,并且需要长期维护。此应用程序仅可安装在Windows上,但我们希望该应用程序在使用.NET 4.8客户端库的同时受益于.NET 6和未来的增强功能。

因此我的问题是:什么样的解决方案会比较好,以便:

  1. 尊重我需要一些4.8代码与该库一起工作的要求。
  2. 利用.NET 6和未来的增强功能。

感谢您的帮助!


你不能同时拥有.NET和.NET Framework代码,因为它们根本无法编译。如果你设法让它编译通过,那么在运行时(在.NET 6下)由于缺少库,它将会失败。你需要两个单独的应用程序,并在它们之间使用某种通信方法。 - Camilo Terevinto
1
如果该库依赖于WCF,则您将陷入困境:WCF在.NET 6上不可用(至少不是以相同的形式)。 - canton7
2
@CamiloTerevinto,那不是真的,你可以从.NET 6引用.NET 4.8并进行编译。在许多情况下,它甚至不会在运行时失败。但在其他情况下可能会失败。 - Evk
如果服务器使用.NET Remoting,那么你就没什么好运气了 - 这个协议在15年前基本上被放弃了,并且没有迁移到.NET Core,因为开发人员根本不使用它。自2000年代中期以来,每个人都使用SOAP或最近的gRPC和REST-y HTTP API。除非有人想要确保客户必须从供应商购买客户端。 - Panagiotis Kanavos
为了共享,我们决定暂时使用.NET 4.8进行开发,因为它提供了我们所需的一切。 - codea
显示剩余3条评论
3个回答

11

是的,您可以从.NET 6引用.NET 4.8程序集。但是,不能保证它按预期工作。仅当它不使用在.NET 6中不存在的任何API(或.NET 4.8支持的.NET标准版本)并且它使用的API没有发生破坏性更改(对于应用程序逻辑而言)时,才能正常工作。

您可以通过创建类似以下内容的.NET 4.8库轻松测试它:

public class Test
{
    public static void OldNet()
    {
        Console.WriteLine("Hello from old .NET");
    }
}

然后在.NET 6中引用它并调用:

 OldNet4.Test.OldNet();

运行代码,将会输出 "Hello from old .NET"。

但是如果在这个旧的 .NET 4.8 库中使用了 Thread.Abort - 在 .NET 6 上运行时,它将不会终止目标线程,而是抛出 PlatformNotSupportedException 异常,这是一个打破变更的例子。如果调用了缺失的 API,则会抛出 TypeNotFound 或类似的异常。

因此,最终结果取决于所引用的库。


有人有 .Net 6.0 不支持的框架 API 列表吗? - Mozzis

0

0
是的,可以有一个使用.NET Framework 4.8编写的客户端和一个使用.NET Core 6编写的服务器。同样可以使用不同的编程语言编写客户端和服务器,因此您的用例是可行的。但是,无法从.NET Framework程序集中引用.NET Core程序集。

1
是的,可以在.NET Framework 4.8中编写客户端,在.NET Core 6中编写服务器。但是需要注意的是,这个问题特指WCF,目前还不可能在任何.NET Core/.NET版本中拥有WCF服务器。 - Camilo Terevinto

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