将.net核心与遗留的.net框架dll一起使用

Hop*_*ppe 12 .net c# .net-core visual-studio-2017

我可以将.net核心与遗留的.net框架dll一起使用吗?答案似乎不是......但我只能找到引用project.json的资源,而这些资源已经不存在了.

我创建了一个新的.net核心库,并试图引用一个遗留的.net框架DLL.当我试图调用DLL时,vs2017抱怨我没有Stream对象正在寻找.

它建议我引用mscorlib.dll或installa Nuget包.

快速帮助未能引用mscorlib.dll.如果我手动引用它,我会收到以下错误:

类型'TargetFrameworkAttribute'存在于'mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'和'System.Runtime,Version = 4.1.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'C:\ Users. .. \应用程序数据\本地\ Temp.NETCoreApp,版本= v1.1.AssemblyAttributes.cs

NuGet包是Microsoft.NETFx2.0.快速帮助无法安装它.如果我从命令行运行它:

> PM> install-package microsoft.netfx20   GET
> https://api.nuget.org/v3/registration2-gz/microsoft.netfx20/index.json
> OK
> https://api.nuget.org/v3/registration2-gz/microsoft.netfx20/index.json
> 46ms Restoring packages for ... Install-Package : Package
> Microsoft.NetFX20 1.0.3 is not compatible with netcoreapp1.1
> (.NETCoreApp,Version=v1.1). Package Microsoft.NetFX20 1.0.3 supports:
> net20 (.NETFramework,Version=v2.0)At line:1 char:1
> + install-package microsoft.netfx20
> + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>     + CategoryInfo          : NotSpecified: (:) [Install-Package], Exception
>     + FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PackageManagement.PowerShellCmdlets.InstallPackageCommand
> Install-Package : One or more packages are incompatible with
> .NETCoreApp,Version=v1.1.At line:1 char:1
> + install-package microsoft.netfx20
> + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>     + CategoryInfo          : NotSpecified: (:) [Install-Package], Exception
>     + FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PackageManagement.PowerShellCmdlets.InstallPackageCommand
> Install-Package : Package restore failed. Rolling back package changes
> for .At line:1 char:1
> + install-package microsoft.netfx20
> + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>     + CategoryInfo          : NotSpecified: (:) [Install-Package], Exception
>     + FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PackageManagement.PowerShellCmdlets.InstallPackageCommand
> Time Elapsed: 00:00:00.8035644
Run Code Online (Sandbox Code Playgroud)

Suc*_*man 24

困难的话题.通常.NET Framework和.NET Core不兼容.它们针对一组不同的程序集(mscorlib与System.Runtime),这会导致不兼容,因为所有类型的用法都以类型所在的程序集为前缀.

从.NET Core 2(当前处于预览版)开始,您可以通过不可见的兼容性垫片引用.NET Framework程序集.这允许您引用程序集并成功编译.

它不保证应用程序将成功运行,因为.NET Core不提供.NET Framework中的所有API.如果是这样的话,你会在运行时获得PlatformNotSupportedExceptionMissingTypeException和朋友一起.

  • @Simon_Weaver 它没有连接到 .NET Standard。.NETCoreApp 是 .NET Standard 的超集,如果您尝试使用的 .NET Framework API 存在于 .NETCoreApp 中,那么 .NET Framework API 应该适用于 .NET Core。不,目前没有计划很快取消此功能。 (3认同)
  • 那么这种“不可见”的东西是如何与 .NET Standard 相关联的呢?我在“旧”DLL 中访问的内容是否需要在 .NET Standard 中才能使这个“垫片”工作?使用 .NET Core 3,他们不会破坏这一点吧?! (2认同)
  • @Suchiman 那么,如果 .NET Core 中确实存在 API,它将在 Core 运行时或 CoreCLR 下编译和运行? (2认同)
  • @joe 是的...不...,您创建一个 .NET Core 项目,然后您可以引用为 .NET Framework 构建的 dll/nuget(很久以前)。当您运行 .NET Core 项目时,它会尝试加载和执行 .NET Framework dll,只要该 API 存在于 core 中,该 dll 就可以工作,如果该 API 不存在,则会引发错误。CoreCLR 是核心运行时顺便说一句。 (2认同)

dat*_*ung 12

基于 Suchiman 的回答,兼容性垫片将允许 .NET Core 应用程序引用 .NET Framework 库并在编译时成功,但如果缺少任何必需的底层 .NET Framework 库,.NET Core 应用程序可能会在运行时失败。

为了提高运行时成功的机会,您可以尝试使用Windows 兼容包。这基本上是试图填补缺失的 .NET Framework 库。缺点是 Windows 兼容包在某种程度上特定于 Windows,因此它可能会影响 .NET Core 应用程序的跨平台兼容性。


som*_*dom 6

我不确定其他答案所指的兼容性垫片是什么,但是从 .NET Core 2 开始,您可以直接在 .NET Core 项目中引用 .NET Framework dll。

请注意,.NET Framework dll 可能正在使用某些 Windows 特定的 API,因此您可能会失去 .NET Core 的交叉兼容性。但是,如果您只是想升级到较新版本的 C#(因为它们现在仅在较新版本的 .NET Core 和 .NET 上可用),那么这并不重要。如果您使用的是 .NET 5 或更高版本,您可能需要使用Windows TFM net5.0-windows来确保您的项目仅针对 Windows 构建。

如果 .NET Framework dll 使用 .NET Core 中不可用的某些 Windows API,则您可以引用Microsoft.Windows.Compatibility NuGet 包(更多信息请参见此处此处)。