Ссылка на библиотеку Framework 4.6 в in.NET проект Core App 1.0.0

Я изучаю доступные мне параметры для ссылки на существующие библиотеки .NET Framework 4.6 в новых проектах приложений .NET Core.

в качестве доказательства концепции я построил очень простую библиотеку .NET Framework 4.6, опубликовал ее как пакет NuGet и включил ее в простое веб-приложение .NET Core.

на данный момент единственный способ, которым я могу получить здание проекта и запустить, - это удалить Microsoft.NETCore.Ссылка на приложение из проекта.в JSON зависимостей заблокируйте и замените netcoreapp1.0 раздел из свойства Framework с блоком net461.

полный проект.json ниже:

{
  "dependencies": {
    /*"Microsoft.NETCore.App": {
      "version": "1.0.0",
      "type": "platform"
    },*/
    "Microsoft.AspNetCore.Diagnostics": "1.0.0",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "FileIOLibrary_1_0_0_0": "1.0.0"
  },

  "tools": {
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final"
  },

  /*"frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8",
        "net461"
      ]
    }
  },*/

  "frameworks": {
    "net461": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ]
    }
  },

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

  "runtimeOptions": {
    "configProperties": {
      "System.GC.Server": true
    }
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "web.config"
    ]
  },

  "scripts": {
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}

это в основном означает, что все ссылки являются библиотеками .NET Framework 4.6.

в любом случае у меня есть несколько вопросов относительно других доступных мне опций:

  1. можно ли указать, что только моя импортированная библиотека должна быть нацелена на .NET 4.6 Framework, а все другие ссылки должны использовать .NET core? Если это так, это означает, что я могу добавить Microsoft.NETCore.Ссылка приложения обратно в проект.
  2. если это невозможно, могу ли я перестроить свою библиотеку как совместимую стандартную библиотеку .NET (я считаю, что версия 1.6 совместима между Framework 4.6 и Core 1.0.0)? Я не смог увидеть опцию в Visual Studio, чтобы позволить мне создавать библиотеки против Стандарта .NET, поэтому был бы признателен за некоторые указатели в этом направлении, если это опция.

1 ответов


боюсь, вы не можете загрузить DLL .NET 4.6.2 в приложение .NET Core.

альтернативный план

в некоторых случаях вы можете написать код один раз, а затем иметь проект для .NET 4.6.2 и проект для .NET Core. Оба проекта указывают на одни и те же файлы кода, но каждый проект имеет другую целевую структуру. Как только вы это сделаете, вы можете создать пакет nuget, который имеет как .NET 4.6.2 DLL и библиотеки DLL .NET Core в нем, что сделает развертывание и построение намного проще.

как получить то же самое здание файлов кода для каждого фреймворка

если у вас есть MyProject.csproj в папке ./NET462/MyProject/ и решение MySolution.sln.

  1. сначала создайте пустую библиотеку .NET Core. Мы назовем это MyProject.Core и мы положим его в ./Core/MyProject.Core/. У нас также будет решение, назовем это ./Core/MySolution.Core.sln.
  2. теперь скопируйте все файлы из оригинального ./NET462/MyProject/ на ./Core/MyProject, в том числе .csproj файл. Скопируйте решение тоже, они будут жить бок о бок.
  3. если вы загрузите исходное решение прямо сейчас, Visual Studio выдаст ошибки, потому что между проектом будет конфликт.json (который используется основным проектом) и .csproj (который используется проектом .NET 4.6.2).
  4. чтобы остановить это, создайте новый файл с именем MyProject.project.json. Это действует как компаньон проекта.json при загрузке проекта .NET 462. Поместите следующее в это:

MyProject.project.json

{
    "version": "1.0.0-*",
    "description": "My Class Library",
    "authors": [
      "Your Name"
    ],
    "tags": [
      ""
    ],
    "projectUrl": "",
    "licenseUrl": "",
    "runtimes": {
      "win": {}
    },
    "frameworks": {
      "net452": {} // You might want net462
    },
    "dependencies": { 
      "Newtonsoft.Json": "9.0.1" /// Just an example of a nuget package
    }
  }
  1. ваш .Проект Net 4.6.2 теперь надо строить как и раньше.
  2. теперь откройте основное решение (это нормально, чтобы иметь обе Visual Studios открыты одновременно), и вы увидите, что все файлы добавляются там. В разделе .NET Core / xproj, проект.файлы json включаются по умолчанию. Вам нужно будет игнорировать файлы, относящиеся к .NET 462, которые являются .csproj и MyProject.project.json.
  3. это, вероятно, не будет стройте, пока не добавите пакеты nuget.

как получить .NET Core и .NET в том же Nuget

  1. как только каждое решение будет построено в режиме выпуска, у вас будет два выхода, DLL для каждой из фреймворков. Вы можете изменить имя библиотеки DLL в файлах проекта (.и проекта csproj файл.json соответственно), но nuget все равно.
  2. создать package.nuspec file и поместите следующее в это:

    <!-- language: lang-xml -->
    <?xml version="1.0"?>
    <package>
      <metadata>
        <id>MyProject</id>
        <version>1.0.0</version>
        <authors>Me</authors>
        <owners>Me</owners>
        <projectUrl></projectUrl>
        <iconUrl>FILL ME IN</iconUrl>
        <description>FILL ME IN</description>
        <copyright>FILL ME IN</copyright>
        <releaseNotes>First attempt</releaseNotes>
        <tags>FILL ME IN</tags>
        <dependencies>
          <group targetFramework="dotnet">
            <dependency id="Newtonsoft.Json" version="9.0.1" />
          </group>
          <group targetFramework="net452">
            <dependency id="Newtonsoft.Json" version="9.0.1" />
          </group>
        </dependencies>
        <frameworkAssemblies>
          <frameworkAssembly assemblyName="System.Core" targetFramework="net452"/>
          <frameworkAssembly assemblyName="System.Core" targetFramework="dotnet" />
        </frameworkAssemblies>
      </metadata>
      <files>
        <file src="Core\MyProject\bin\release\MyProject.dll" target="lib/net452" />
        <file src="Core\MyProject\bin\release\MyProject.Core.dll" target="lib/dotnet" />
      </files>
    </package>
    
  3. используйте это для создания пакета nuget, и при включении в основную систему nuget будет обслуживать правильный пакет.

Больше Пример

мой JsonApi библиотека делает это и дополнительно имеет два веб-проекта, один для .NET 4.6.2 и один для .NET Core, потому что они используют разные базовые классы. Основная общая библиотека используется обоими.

большой нюанс

некоторые библиотеки, на которые полагается .NET 4.6.2, будут недоступны вашему основному приложению. Два раза, когда я это делал, это было System.Web это поймало меня. System.Web в .NET 4.6.2 действительно является оболочкой для IIS. Лучший способ узнать-попробовать объединить проекты выше и продолжать добавлять пакеты nuget в project.json пока вы не нажмете что-то, что не существует для сердечника.

все меняется

команда .NET в может 2016 сказал, что они отходят от использования project.json в конце 2016 года. В этот момент я предполагаю, что эти проблемы могут исчезнуть, поскольку visual studio должна иметь возможность обрабатывать два вида .csproj жить бок о бок. В зависимости от вашей коммерческой ситуации, я бы подождал этого изменения!