Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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
C# 将.net core与旧式.net framework DLL一起使用_C#_.net_.net Core_Visual Studio 2017 - Fatal编程技术网

C# 将.net core与旧式.net framework DLL一起使用

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

我可以将.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。快速帮助无法安装它。如果我从命令行运行它:

> 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。