【问题标题】:Referencing Framework 4.6 Library in in .NET Core App 1.0.0 project在 .NET Core App 1.0.0 项目中引用 Framework 4.6 库
【发布时间】:2016-09-27 09:50:06
【问题描述】:

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

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

到目前为止,我似乎能够让项目构建和运行的唯一方法是从 project.json 依赖项块中删除 Microsoft.NETCore.App 引用,并将框架属性中的 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 标准构建库的选项,因此如果可以选择,我将不胜感激。

【问题讨论】:

  • 一个 nuget 包可以针对多个框架,但您必须为每个框架(.NET 462 和 .NET Core)构建一个解决方案,然后将它们打包在一起。我在这里做的打包在一起(我使用的是 NET452 但这是同样的问题):github.com/brainwipe/NJsonApiCore/blob/master/Package.nuspec 有帮助吗?
  • 如果我的思路正确,我可以把它写成答案,我不能 100% 确定你想要达到的目标!
  • 你好罗。实际要求是看看我们是否可以构建引用一些旧的 .NET Framework 程序集的 .NET 核心应用程序。最好不必重新编译我们的库(如我上面的示例),但仍保留尽可能多的核心功能(尽管我很清楚引用任何 .NET 框架库将意味着使用 .NET 的好处核心将不可用)。失败的首选是重新编译库以确保它们与 .NET 标准 1.6 兼容,尽管我不确定您实际上是如何管理它的。
  • 好的,我明白了,我会写下我的答案。 (当我这样做时,答案是否定的,你不能)

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


【解决方案1】:

恐怕您无法将 .NET 4.6.2 DLL 加载到 .NET Core 应用程序中。

替代方案

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

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

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

  1. 首先创建一个空的 .NET Core 库。我们将其命名为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 的伴侣。将以下内容放入其中:

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 Studio),您会看到所有文件都已添加到其中。在 .NET Core / xproj 下,Project.json 文件是默认包含的。您需要忽略特定于 .NET 462 的文件,即 .csprojMyProject.project.json
  3. 在您添加 nuget 包之前,它可能不会构建。

如何将 .NET Core 和 .NET 放入同一个 Nuget

  1. 在发布模式下构建每个解决方案后,您将有两个输出,即每个框架的一个 DLL。您可以更改项目文件(分别为 .csproj 和 project.json)中 DLL 的名称,但 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 将提供正确的包。

更大的例子

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

大警告

您的 .NET 4.6.2 所依赖的某些库将不可用于您的 Core 应用程序。我做过两次是System.Web 让我失望了。 .NET 4.6.2 中的System.Web 实际上是 IIS 的包装器。找出答案的最佳方法是尝试合并上面的项目并继续将 nuget 包添加到 project.json,直到遇到 Core 不存在的内容。

情况正在改变

May 2016 中的 .NET 团队表示,他们将在 2016 年底不再使用 project.json。到那时,我想这些问题可能会消失,因为 Visual Studio 应该能够处理两个种.csproj并肩生活。根据您的商业情况,我会等待更改!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多