Ссылка .NET 4.5 dll в .NET Core 1.1 csproj?

Я запускаю VS 2017 RC4.

Я добавляю ссылку в моем приложении .NET Core к своей .NET-библиотеке .NET 4.5, и она компилируется. Когда строка, ссылающаяся на dll, вызывается во время выполнения, я получаю:

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.'

Это изображение показывает, что для использования 4,5 ссылок мне нужно использовать netstandard 1.1. https://msdnshared.blob.core.windows.net/media/2016/07/172.png

Предполагая, что это то, что мне нужно, как мне ссылаться на мой .csproj? Я могу найти только старую документацию, когда вместо нее использовался project.json.

Я попробовал добавить ниже, но это не помогло:

<NetStandardImplicitPackageVersion>1.1</NetStandardImplicitPackageVersion>

Кроме того, мне нужно добавить:

<RuntimeFrameworkVersion>1.0.3</RuntimeFrameworkVersion>

Или я получаю FileNotFoundException: Не удалось загрузить файл или сборку. Система не может найти указанный файл.

Почему это?

Вот соответствующие части моего .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>

Ответ 1

Вы не можете (безопасно) загрузить библиотеку .NET Framework 4.5 в .NET Core, потому что она может использовать API, которые недоступны в .NET Core.

Только если ваша библиотека нацелена на portable-net45+win8 (.NET Framework 4.5 и Windows 8 Portable Class Profile или выше), ее можно использовать с .NET Core. Поскольку этот конкретный профиль PCL ограничивает API, который совместим с (то, что раньше называлось WinRT) System.Runtime, на котором основан .NET Core.

Список совместимых профилей PCL см. этот список (Совместимость с PCL внизу)

Если сборка, которую вы хотите ссылаться, не поддерживает netstandard1.x или любой из поддерживаемых профилей, вы должны нацеливаться на .NET Framework 4.5 вместо .NET Core.

В вашем csproj

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

или если вы используете несколько целевых объектов

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

Вы просто не можете автоматически использовать любую библиотеку .NET Framework 4.5 в своем проекте .NET Core. Только PCL и netstandard1.x.

Update

Для полноты:

Если вы определенный, что ваша библиотека/пакет классов нацелена на совместимый PCL, вы можете сделать nuget также восстановлением этих пакетов, даже если они не нацелены на netstandard1.x.

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

Слово предупреждения

Никогда, повторяю, НИКОГДА не помещать что-либо еще, кроме совместимых библиотек PCL. НИКОГДА не ставьте здесь net45. Это просто заставит NuGet загружать и устанавливать этот пакет, но он не заставит его работать и сбой во время выполнения с аналогичной ошибкой, как у вас выше!

Только там, чтобы заставить nuget установить пакет, который знает работать с .NET Core в течение переходного периода, пока большинство пакетов не нацелится на netstandard1.x!