Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 能否将面向完整框架的包导入ASP.NET Core 3+;应用_Asp.net Core_.net Standard_Asp.net Core 3.0 - Fatal编程技术网

Asp.net core 能否将面向完整框架的包导入ASP.NET Core 3+;应用

Asp.net core 能否将面向完整框架的包导入ASP.NET Core 3+;应用,asp.net-core,.net-standard,asp.net-core-3.0,Asp.net Core,.net Standard,Asp.net Core 3.0,我的理解是,从ASP.NET Core 3.0开始,.NET Framework是不受支持的目标框架,因此只能在.NET Core运行时上运行 如果是这种情况,哪些NuGet软件包可以导入到ASP.NET Core 3应用程序中 我假设您可以引用任何以netstandard为目标的包,但是只以完整框架为目标的包(即只以net45为目标的遗留包)又如何呢 如果导入的包引用的程序集不是.NET Core的一部分,例如,System.Drawing?TL;DR:您仍然可以从.NET Core 3甚至.

我的理解是,从ASP.NET Core 3.0开始,.NET Framework是不受支持的目标框架,因此只能在.NET Core运行时上运行

如果是这种情况,哪些NuGet软件包可以导入到ASP.NET Core 3应用程序中

我假设您可以引用任何以
netstandard
为目标的包,但是只以完整框架为目标的包(即只以
net45
为目标的遗留包)又如何呢


如果导入的包引用的程序集不是.NET Core的一部分,例如,
System.Drawing

TL;DR:您仍然可以从.NET Core 3甚至.NET 5引用(依赖于.NET Framework程序集的包),但是如果您调用依赖于.NET Core不支持的API或库的任何代码,您将收到运行时错误。您可以使用Microsoft的


背景 首先,你是对的,就像。这一功能是以前的,因此为迁移到.NETCore的web应用程序提供了一个中间解决方案

注意:由于.NET Framework仅在Windows计算机上运行,因此编写以.NET Framework为目标的ASP.NET核心web应用程序会隐式限制这些应用程序在Windows上运行

行为 但是,即使针对.NET Core或现在的.NET 5,您仍然能够引用.NET Framework软件包和程序集,前提是您在Windows计算机上并安装了相应的.NET Framework。它的内部工作有点复杂,但不足之处在于,.NET内核和.NET 5将对.NET Framework汇编进行评估,就好像它们是。如果API调用也在.NET核心运行时中实现,那么它可以正常工作,但是如果API调用是.NET Framework的专有部分,您将收到一个异常

惊喜强调这是一个运行时异常非常重要。您仍然可以引用.NET Framework程序集,编写对有问题成员的调用,并在没有任何警告的情况下编译代码。但是,只要调用依赖于.NET Framework特定程序集的代码,就会收到运行时异常

例子 在.NET3.0中,.NETFramework库的很大一部分已移植到.NETCore。事实上,这包括您作为示例引用的大多数库,尽管有。但是,如果你再深入一点,有很多库仍然不受支持。一个明显的例子是,它可用于从
web.config
文件访问配置设置

.NET框架代码 例如,假设在.NET Framework类库中有以下函数,它从
web.config
返回一个键数组,这正是出于此目的

从.NET5开始,SDK中还内置了一个用于识别特定平台上.NET5运行时不支持的调用的插件。这要求目标库使用
[SupportedOSPlatform()]
属性显式地注释它们的类型,这样您就不会得到任何关于遗留.NET Framework类型的警告。但这将有助于识别针对各种平台的库的类似类型的兼容性问题

例子 例如,如果您在上述示例代码上运行Portability Analyzer,它将确定
T:System.Web.Configuration.WebConfigurationManager
不受支持,例如
.NET Core,Version=v3.1
.NET Standard+Platform Extensions,Version=v2.0

注意:微软曾经提供as,它承诺在Visual Studio中提供设计时分析。不幸的是,已经两年没有更新了,而且。在我的评估中,它在识别问题方面并不有效

样本项目 我把一个例子放在一起演示了上述行为。它包括以下项目:

  • 以.NET Framework 4.8为目标
  • 以.NET核心3.1为目标
  • 与呼吁的遗产
两个ASP.NET核心网站都包含两个端点,它们调用同一个.NET Framework 4.8类库。第一个是“Hello world”示例,它将在两个项目上都能很好地执行,因为它完全依赖于公共API:

http://localhost:5000/Basic/Index
第二个将在ASP.NET Core 3.1项目上失败,因为它调用了遗留的
WebConfiguration Manager
API:

http://localhost:5000/Basic/Configuration
免责声明:这是一个快速而肮脏的存储库,在发布之前,我将其放在一起以验证我的理解。如果有人感兴趣,我会整理并记录下来。然而,就目前而言,它可能对你们中需要看到这一点的人很有用

致谢
去年提供了类似的材料。这本书值得一读。

我认为这是不可能的。不过也有港口。例如,
System.Drawing
可以在nuget上找到,并安装在.net core项目上。您可以参考针对
net45
的nuget软件包,但前提是它们使用.net core 3.x中提供的API。因此,基本上您必须在所需的程序集上运行.NET兼容性分析器。如果必须调用.NET Framework的别名,请使用“弃用的Framework”而不是“完整的Framework”。因为.NET Framework不是.NET Core的超集,也没有获得任何功能更新。仅供参考:这个答案在.NET 5中仍然适用,在即将发布的.NET 6中也应该如此。我已经更新了答案来解释这一点,以及一些.NET5特定的注意事项,例如引入for来警告.NET5本身的平台变化。