C# 将.net core与旧式.net framework DLL一起使用
我可以将.net core与旧式.net framework DLL一起使用吗?答案似乎是否定的。。。但是我只能找到引用project.json的资源,它已经不存在了。 我创建了一个新的.net核心库,并尝试引用一个遗留的.net framework DLL。当我试图调用DLL时,vs2017抱怨我没有找到Stream对象正在查找的内容 它建议我引用mscorlib.dll或安装一个Nuget包 快速帮助无法引用mscorlib.dll。如果我手动引用它,则会出现以下错误: 类型“TargetFrameworkAttribute”存在于“mscorlib”和“mscorlib”中, 版本=4.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089'和 'System.Runtime,版本=4.1.0.0,区域性=中性, PublicKeyToken=b03f5f7f11d50a3a'C:\Users…\AppData\Local\Temp.NETCoreApp,版本=v1.1.AssemblyAttributes.cs NuGet软件包是Microsoft.NETFx2.0。快速帮助无法安装它。如果我从命令行运行它:C# 将.net core与旧式.net framework DLL一起使用,c#,.net,.net-core,visual-studio-2017,C#,.net,.net Core,Visual Studio 2017,我可以将.net core与旧式.net framework DLL一起使用吗?答案似乎是否定的。。。但是我只能找到引用project.json的资源,它已经不存在了。 我创建了一个新的.net核心库,并尝试引用一个遗留的.net framework DLL。当我试图调用DLL时,vs2017抱怨我没有找到Stream对象正在查找的内容 它建议我引用mscorlib.dll或安装一个Nuget包 快速帮助无法引用mscorlib.dll。如果我手动引用它,则会出现以下错误: 类型“TargetF
> 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
难题。通常.NET Framework和.NET Core是不兼容的。它们的目标是一组不同的程序集(mscorlib与System.Runtime),这会导致不兼容,因为所有类型的用法都以该类型所属的程序集为前缀 从.NET Core 2(当前处于预览中)开始,您可以通过不可见的兼容性垫片引用.NET Framework程序集。这允许您引用程序集并成功编译
但它不能保证应用程序能够成功运行,因为.NETCore并没有提供来自.NETFramework的所有API。如果是这样的话,您将在运行时获得
平台不支持异常
或MissingTypeException
和朋友。在Suchiman的答案之上构建,兼容性垫片将允许.NET Core应用程序引用.NET Framework库并在编译时成功,但如果缺少任何必需的底层.NET Framework库,.NET Core应用程序可能在运行时失败
要提高运行时的成功几率,可以尝试使用。这基本上是为了填补缺少的.NET Framework库。缺点是Windows Compatibility Pack在某种程度上特定于Windows,因此它可能会影响.NET Core应用程序的跨平台兼容性。我不确定其他答案所指的兼容性是什么,但是,您可以直接引用.NET Core项目中的.NET Framework dll 请注意,.NET Framework dll可能正在使用某些特定于Windows的API,因此您可能会失去.NET Core的交叉兼容性。但是,如果您只是想升级到较新版本的C#(因为它们现在只在较新版本的.NET Core和.NET上可用),那就没那么重要了。如果您使用的是.NET 5或更高版本,您可能希望使用
net5.0-windows
来确保您的项目仅为windows构建
如果.NET Framework dll使用的某些Windows API在.NET Core中不可用,那么您可以参考(更多信息和)。那么这种“不可见性”是如何连接到.NET标准的呢?我在“旧”DLL中访问的内容是否需要在.NET标准中才能使用此“垫片”?而使用.NET Core 3,他们没有打破这一点,对吗@Simon_Weaver它未连接到.NET标准。NETCoreApp是.NET标准的超集,如果您尝试使用的.NET Framework API存在于.NETCoreApp中,则.NET Framework API应在.NET Core上工作。不,目前还没有计划在短期内删除此功能。@Suchiman因此,如果API确实存在于.NET Core中,它将在Core runtime或CoreCLR下编译和运行?@joe Yeah…不…,您创建了一个.NET Core项目,然后可以引用(很久以前)为.NET Framework构建的DLL/nuget。运行.NET Core项目时,它将尝试加载并执行.NET Framework dll,只要API存在于Core中,该dll就会工作。如果API不存在,则会引发错误。CoreCLR是核心运行时。顺便说一句@joe no这就是我想说的,永远不会加载.NET Framework,不兼容会导致错误,不会返回到.NET Framework。