在.NET Core App 1.0.0项目中引用Framework 4.6 Library

时间:2016-09-27 09:50:06

标签: c# .net .net-core .net-4.6

我一直在研究可用于在新的.NET Core App项目中引用现有.NET Framework 4.6库的选项。

作为概念验证,我构建了一个非常简单的.NET Framework 4.6库,将其作为NuGet包发布,并将其包含在一个简单的.NET Core Web应用程序中。

到目前为止,我似乎能够让项目构建和运行的唯一方法是从project.json依赖项块中删除Microsoft.NETCore.App引用,并从frameworks属性中替换netcoreapp1.0部分一个net461块。

下面的完整project.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核心?如果是这样,这意味着我可以将Microsoft.NETCore.App引用添加回项目中。
  2. 如果以上是不可能的,我可以将我的库重建为兼容的.NET标准库(我相信版本1.6在Framework 4.6和Core 1.0.0之间兼容)?我一直无法在Visual Studio中看到一个允许我根据.NET标准构建库的选项,所以如果它是一个选项,我会很欣赏这方面的一些指示。

1 个答案:

答案 0 :(得分:6)

我担心您无法将.NET 4.6.2 DLL加载到.NET Core应用程序中。

替代计划

在某些情况下,您可以编写一次代码,然后创建.NET 4.6.2项目和.NET Core项目。两个项目都指向相同的代码文件,但每个项目都有不同的框架目标。一旦你有了这个工作,你可以构建一个nuget包,其中包含.NET 4.6.2 DLL .NET Core DLL,这将使部署和构建更加简单。

如何为每个框架构建相同的代码文件

假设您在MyProject.csproj文件夹和解决方案./NET462/MyProject/中有MySolution.sln

  1. 首先创建一个空的.NET核心库。我们将其称为MyProject.Core,我们会将其放入./Core/MyProject.Core/。我们也会有一个解决方案,称之为./Core/MySolution.Core.sln
  2. 现在将原始./NET462/MyProject/中的所有文件复制到./Core/MyProject,包括.csproj。复制解决方案,他们将并排生活。
  3. 如果您现在加载原始解决方案,则Visual Studio将抛出错误,因为project.json(由Core项目使用)和.csproj(由.NET 4.6使用)之间会发生冲突.2项目)。
  4. 要停止此操作,请创建一个名为MyProject.project.json的新文件。这在加载.NET 462项目时充当project.json的伴侣。将以下内容放入其中:
  5. 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. 现在打开Core解决方案(可以同时打开两个Visual Studios),您将看到所有文件都添加到其中。在.NET Core / xproj下,Project.json文件是默认包含的。您将需要忽略特定于.NET 462的文件,即.csprojMyProject.project.json
    3. 在你添加nuget包之前,它可能不会构建。
    4. 如何将.NET Core和.NET引入相同的Nuget

      1. 在Release模式下构建每个解决方案后,您将拥有两个输出,每个框架都有一个DLL。您可以在项目文件中更改DLL的名称(分别是.csproj和project.json),但nuget并不关心。
      2. 创建一个package.nuspec文件并在其中加入以下内容:

        <!-- 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将提供正确的包。

      4. 更大的例子

        我的JsonApi库执行此操作,此外它还有两个Web项目,一个用于.NET 4.6.2,另一个用于.NET Core,因为它们使用不同的基类。两者都使用主共享库。

        大警告

        您的.NET应用程序无法使用.NET 4.6.2所依赖的某些库。我已经两次这样做了System.Web已经把我抓了出来。 .NET 4.6.2中的System.Web实际上是IIS的包装器。找出的最好方法是尝试合并上面的项目并继续将nuget包添加到project.json,直到找到Core不存在的内容。

        事情正在发生变化

        May 2016中的.NET团队表示,他们在2016年底正在逐渐停止使用project.json。此时,我想这些问题可能会因视觉工作室应该消失而消失能够处理两种.csproj并排生活。根据您的商业情况,我会等待改变!