web-dev-qa-db-fra.com

Référence .NET 4.5 dll dans .NET Core 1.1 csproj?

Je suis sous VS 2017 RC4.

J'ajoute une référence dans mon application .NET Core à ma dll .NET 4.5 et le compile. Quand une ligne qui référence la dll est appelée au moment de l'exécution, je reçois:

System.IO.FileNotFoundException: 'Could not load file or Assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. The system cannot find the file specified.'

Cette image montre que pour utiliser les références 4.5, je dois utiliser netstandard 1.1 . https://msdnshared.blob.core.windows.net/media/2016/07/172.png

En supposant que c’est ce dont j’ai besoin, comment puis-je le référencer dans mon .csproj? Je ne trouve que l'ancienne documentation pour savoir quand project.json a été utilisé à la place.

J'ai essayé d'ajouter ce qui suit mais cela n'a pas aidé:

<NetStandardImplicitPackageVersion>1.1</NetStandardImplicitPackageVersion>

Aussi, j'ai besoin d'ajouter:

<RuntimeFrameworkVersion>1.0.3</RuntimeFrameworkVersion>

Ou j'obtiens FileNotFoundException: Impossible de charger le fichier ou l'assembly. Le système ne peut pas trouver le fichier spécifié.

Pourquoi donc?

Voici les parties pertinentes de mon .csproj:

<PropertyGroup>
    <TargetFramework>netcoreapp1.1</TargetFramework>
    <PackageTargetFallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</PackageTargetFallback>
<RuntimeFrameworkVersion>1.0.3</RuntimeFrameworkVersion>
  </PropertyGroup>
<ItemGroup>
    <Reference Include="My4.5dll">
      <HintPath>Dlls\My4.5dll.dll</HintPath>
    </Reference>
  </ItemGroup>
15
KevinUK

Vous ne pouvez pas (en toute sécurité) charger une bibliothèque .NET Framework 4.5 dans .NET Core, car elle peut utiliser des API qui ne sont pas disponibles dans .NET Core. 

Si votre bibliothèque cible portable-net45+win8 (.NET Framework 4.5 et Profil de classe portable Windows 8 ou supérieur), elle peut être utilisée avec .NET Core. Parce que ce profil PCL spécifique limite l'API compatible à (ce qui était auparavant appelé WinRT) System.Runtime, qui est basé sur .NET Core.

Pour obtenir une liste des profils PCL compatibles, voir cette liste (Compatibilité PCL en bas).

Si l'assembly que vous souhaitez référencer ne prend pas en charge netstandard1.x ni aucun des profils pris en charge, vous devez obligatoirement target .NET Framework 4.5 au lieu de .NET Core. 

Dans votre csproj

<TargetFramework>net45</TargetFramework>
...
<ItemGroup>
    <PackageReference Include="Net45DependencyHere" Version="4.5.0" />

ou si vous multi-cible

<TargetFrameworks>net45;netcoreapp1.1</TargetFrameworks>
...
<ItemGroup>
    <PackageReference Condition="'$(TargetFramework)' == 'net45' Include="Net45DependencyHere" Version="4.5.0" />
    <PackageReference Condition="'$(TargetFramework)' == 'netcoreapp1.1' Include="NetCoreReplacementLibrary" Version="1.1.0" />

Vous ne pouvez tout simplement pas utiliser par magie une bibliothèque .NET Framework 4.5 dans votre projet .NET Core. Seulement PCL et netstandard1.x.

Mettre à jour

Par souci d'exhaustivité: 

Si vous êtes certain que votre bibliothèque/package de classe cible un PCL compatible, vous pouvez également faire en sorte que le nuget restaure ce package, même s'il ne cible pas netstandard1.x

<PropertyGroup>
    <PackageTargetFallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</PackageTargetFallback>
</PropertyGroup>

Mot d'avertissement

Jamais, je répète, JAMAIS mettre autre chose à part les bibliothèques PCL compatibles. NEVER mettez net45 ici. Cela obligera simplement NuGet à télécharger et à installer ce paquet, mais cela ne fonctionnera pas et ne se plantera pas à l'exécution avec une erreur similaire à celle décrite ci-dessus! 

C'est seulement là pour forcer Nuget à installer des paquets qui sont connus pour fonctionner avec .NET Core pendant la période de transition, jusqu'à ce que la plupart des paquets ciblent netstandard1.x!

14
Tseng

J'ai eu le même problème, mais avec .NET Standard 2.0 et un .NET Framework 4.0 Assembly. La solution consistait à créer une nuget avec ma dll dans l’explorateur de package de nuget ciblant .NET Standard 2.0, puis à ajouter le package au projet.

Lien vers Nuget Explorer: https://github.com/NuGetPackageExplorer/NuGetPackageExplorer

0
JCelento