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

时间:2017-07-23 01:33:59

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

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

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

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

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

  

类型' TargetFrameworkAttribute'存在于&#m; mscorlib中,   Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'和   ' System.Runtime,Version = 4.1.0.0,Culture = neutral,   公钥= b03f5f7f11d50a3a' C:\用户... \应用程序数据\本地\ 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

3 个答案:

答案 0 :(得分:18)

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

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

虽然.NET Core无法提供.NET Framework中的所有API,但它并不能保证应用程序能够成功运行。如果是这样的话,您将在运行时获得PlatformNotSupportedExceptionMissingTypeException和朋友。

答案 1 :(得分:6)

基于Suchiman的回答,兼容性填充程序将允许.NET Core应用程序引用.NET Framework库并在编译时成功,但如果有任何必需的基础.NET Framework库,则.NET Core应用程序可能会在运行时失败。丢失了。

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

答案 2 :(得分:1)

我不确定其他答案所指的兼容性垫片是什么,但是,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 使用的某些 Windows API 在 .NET Core 中不可用,那么您可以参考 Microsoft.Windows.Compatibility NuGet package(更多信息 herehere)。