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

kh2*_*h25 7 .net c# .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引用,并使用net461块替换frameworks属性中的netcoreapp1.0部分.

完整的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%" ]
  }
}
Run Code Online (Sandbox Code Playgroud)

这基本上意味着所有引用都是.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标准构建库的选项,所以如果它是一个选项,我会欣赏这方面的一些指示.

Dr *_*ang 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的伴侣.将以下内容放入其中:

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
    }
  }
Run Code Online (Sandbox Code Playgroud)
  1. 您的.NET 4.6.2项目现在应该像以前一样构建.
  2. 现在打开Core解决方案(可以同时打开两个Visual Studios),你会看到所有文件都添加到那里.在.NET Core/xproj下,Project.json文件是默认包含的.您将需要忽略特定于.NET 462的文件,它们是.csprojMyProject.project.json.
  3. 在你添加nuget包之前,它可能不会构建.

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

  1. 一旦每个解决方案都在发布模式下构建,您将有两个输出,每个框架的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>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用它来构建您的nuget包,当包含在您的主系统中时,nuget将提供正确的包.

更大的例子

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

大警告

.NET 4.6.2所依赖的某些库将无法用于您的Core应用程序.这两次我做到了这一直是System.Web我抓住了我.System.Web在.NET 4.6.2中,它实际上是IIS的包装器.找出最好的方法是尝试合并上面的项目并继续添加nuget包,project.json直到你遇到Core不存在的东西.

事情正在改变

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