【问题标题】:Use .net core with legacy .net framework dlls将 .net 核心与旧版 .net 框架 dll 一起使用
【发布时间】:2017-12-28 20:54:07
【问题描述】:

我可以将 .net 核心与旧版 .net 框架 dll 一起使用吗?答案似乎是否定的……但我只能找到引用 project.json 的资源,该资源已不存在。

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

它建议我引用 mscorlib.dll 或安装 Nuget 包。

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

“TargetFrameworkAttribute”类型存在于“mscorlib”中, 版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089' 和 'System.Runtime,版本=4.1.0.0,文化=中性, PublicKeyToken=b03f5f7f11d50a3a' C:\Users...\AppData\Local\Temp.NETCoreApp,Version=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

【问题讨论】:

    标签: c# .net .net-core visual-studio-2017


    【解决方案1】:

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

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

    它不能保证应用程序会成功运行,因为 .NET Core 不提供 .NET Framework 的所有 API。如果是这种情况,您将在运行时收到 PlatformNotSupportedException 或 MissingTypeException 和朋友。

    【讨论】:

    • 那么这个“不可见”的东西是如何连接到 .NET Standard 的呢?我在“旧”DLL 中访问的内容是否需要在 .NET Standard 中才能使这个“垫片”工作?使用 .NET Core 3 他们并没有打破这一点吗?!
    • @Simon_Weaver 它没有连接到 .NET Standard。 .NETCoreApp 是 .NET Standard 的超集,如果您尝试使用的 .NET Framework API 存在于 .NETCoreApp 中,那么 .NET Framework API 应该可以在 .NET Core 上运行。不,目前没有计划很快放弃此功能。
    • @Suchiman 那么如果 API 确实存在于 .NET Core 中,它将在 Core runtime 或 CoreCLR 下编译和运行?
    • @joe 是的......不......,您创建一个 .NET Core 项目,然后您可以引用为 .NET Framework 构建的 dll / nuget(很久以前)。当您运行 .NET Core 项目时,它将尝试加载和执行 .NET Framework dll,只要 API 存在于核心中,该 dll 就可以工作,如果 API 不存在,则会引发错误。 CoreCLR 是核心运行时顺便说一句。
    • @joe 不,这就是我想说的,永远不会加载 .NET Framework,不兼容会导致错误,不会退回到 .NET Framework。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我不确定其他答案所指的兼容性垫片是什么,但是as of .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 package(更多信息 here 和 here)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-16
        • 1970-01-01
        相关资源
        最近更新 更多