簡體   English   中英

將 .net 核心與舊的 .net 框架 dll 一起使用

[英]Use .net core with legacy .net framework dlls

我可以將 .net core 與舊的 .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=b03f5f7f11ds\\Usera\\ ..\\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

困難的話題。 通常 .NET Framework 和 .NET Core 是不兼容的。 它們針對一組不同的程序集(mscorlib 與 System.Runtime),這會導致不兼容,因為所有類型的用法都以類型來自的程序集為前綴。

從 .NET Core 2(目前為預覽版)開始,您可以通過不可見的兼容性墊片引用 .NET Framework 程序集。 這允許您引用程序集並成功編譯。

雖然它不保證應用程序會成功運行,因為 .NET Core 不提供 .NET Framework 的所有 API。 如果是這種情況,您將在運行時收到PlatformNotSupportedExceptionMissingTypeException和朋友。

基於 Suchiman 的回答,兼容性墊片將允許 .NET Core 應用程序引用 .NET Framework 庫並在編譯時成功,但如果缺少任何必需的底層 .NET Framework 庫,.NET Core 應用程序可能會在運行時失敗。

為了提高運行時成功的機會,您可以嘗試使用Windows 兼容包 這基本上是試圖填補缺失的 .NET Framework 庫。 缺點是 Windows 兼容包在某種程度上特定於 Windows,因此它可能會影響 .NET Core 應用程序的跨平台兼容性。

我不確定其他答案所指的兼容性墊片是什么,但是, 從 .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 包(更多信息在這里這里)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM