【问题标题】:A common class library consumed by both .NET Core and .Net 4.5.2.NET Core 和 .Net 4.5.2 使用的通用类库
【发布时间】:2016-07-06 15:46:14
【问题描述】:

我对 .Net Core 还很陌生,但是已经创建了一个可以工作的 Asp.Net Core WebAPI 站点 - 现在我想与另一个项目共享一些代码...

  • 我已经安装了更新 3 的 Visual Studio 2015。
  • 我从here 安装了DotNetCore.1.0.0-VS2015Tools.Preview2.exe。

我想创建一个可以被其他两个库使用的共享库 (PCL) - 它只包含没有其他依赖项的原始类/接口。其中一个使用库是一个新的面向“netstandard1.6”的 vanilla 项目,另一个是一个面向 .Net 4.5.2 的旧客户端库(如果必须,我可以将其升级到 4.6.x)。

我一直在兜圈子,我无法让 netstandard1.6 库引用 PCL - 我只是被告知缺少类型:

错误 CS0246:找不到类型或命名空间名称“SomeTypeHere”(您是否缺少 using 指令或程序集引用?)

名为“ClassLibrary1”的 PCL 的 project.json 自动生成为:

{
  "supports": {},
  "dependencies": {
    "Microsoft.NETCore.Portable.Compatibility": "1.0.1",
    "NETStandard.Library": "1.6.0"
  },
  "frameworks": {
    "netstandard1.1": {}
  }
}

我的消费库 project.json 是:

{
  "version": "1.0.0-*",
  "dependencies": {
    "NETStandard.Library": "1.6.0",
    "Newtonsoft.Json": "9.0.1"
  },
  "frameworks": {
    "netstandard1.6": {
      "dependencies": {
        "ClassLibrary1": {
          "target": "project"
        }
      }
    }
  }
}  

我怎样才能做到这一点?

编辑 2016 年 7 月 7 日:

我提供了以下解决方案,它演示了我的设置: https://github.com/JonnyWideFoot/netcore-prototype 请参阅 ExperimentClient::GetLocationAsync 了解我想在 .Net 4.5.2 / 4.6.x 客户端中使用合同库的位置。

【问题讨论】:

  • 仅供参考 - 随着 .NET Core 的出现,它们不再被称为 PCL :)

标签: .net portable-class-library .net-core


【解决方案1】:

以下是我创建可用于 .NET Core 项目和 .NET 4.5 项目的共享库的方法:

SharedLibrary\project.json

"dependencies": { },
"frameworks": {
  "net45": { },
  "netstandard1.1": {
    "dependencies": {
      "NETStandard.Library": "1.6.0"
    }
  }
},
"version": "1.0.0"

同一解决方案中的消费 (.NET Core) 库像这样引用它:

"dependencies": {
  "SharedLibrary": {
    "target": "project",
    "version": "1.0.0"
  }
},
"frameworks": {
  "netstandard1.1": { }
  }
}

使用 project.json 的 .NET 4.5 项目看起来与框架部分中的 net45 不同。如果为 SharedLibrary 生成 NuGet 包,安装在基于 csproj 的 .NET 4.5 项目中也可以。

根据.NET Platform Standard docs,简单地定位netstandard1.1 应该也允许将共享库安装在.NET 4.5+ 项目中。我遇到了奇怪的问题,但这可能是测试工具的结果。

【讨论】:

  • 谢谢! - 我现在已经让“netstandard 端”工作了,但在从 .Net 4.5.2 客户端引用共享项目时仍然存在问题。 { "dependencies": {}, "frameworks": { "net452": {} }, "version": "1.0.0" } 我在 Visual Studio 中引用了该项目(两个库都在同一个解决方案中),我得到“错误 CS0234”。但是,共享库生成了一个 .Net 4.5.2 dll。奇怪的是,如果我直接引用它,一切正常。
  • 引用项目而不是DLL时,属性窗口中的提示路径是正确的:\ClientLib\bin\Debug\net452\SharedLib.dll 都很奇怪... $ 使这些东西变得如此复杂。 .Net 曾经很简单:-(
  • @JonRea:澄清一下——您是从基于project.json 还是基于csproj 的.NET 4.5.2 项目中引用共享项目?
  • “您是从 .NET 4.5.2 项目中引用共享项目” - 是的......“基于 project.json 或基于 csproj” - 这取决于我选择的 VS 模板.我试过 xproj 和 csproj,都有一个 project.json。
  • 我已编辑问题以添加示例解决方案。
【解决方案2】:

我发现完成这项工作的唯一方法是引用客户端库的 .csproj 文件: https://github.com/JonnyWideFoot/netcore-prototype/blob/master/src/JE.API.Experiment.Client/JE.API.Experiment.Client.csproj

<Reference Include="JE.Api.Experiment.Contract, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> <HintPath>..\JE.Api.Experiment.Contract\bin\$(Configuration)\net452\JE.Api.Experiment.Contract.dll</HintPath> </Reference>

通过硬编码合同库中正确输出文件夹的路径,一切都很好。

...认为这可能是 Visual Studio 中的错误。

【讨论】:

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