21

我想要:

  • 制作一个定义一些接口和简单的通用帮助类的类库。它将依赖通用集合,IQueryable<T>但没有第三方依赖项(嗯,JetBrains.Annotations)。
  • 能够从任何地方引用该类库(特别是 UWP、net46 和 ASP.Net Core RC2)
  • 理想情况下,始终使用 project.json 系统,尽管我准备在需要时牺牲它。
  • 将完成的库发布到 NuGet 源,然后在其他应用程序中使用它

在 Visual Studio 2015.2 中创建我的类库项目时,我找到了Class Library (.NET Core)模板,其中指出

用于将类库创建为可面向任何平台的 NuGet 包的项目模板

任何平台!太棒了......但我无法让它工作。经过大量的摆弄,我目前有以下内容project.json(我现在可能已经完全打破了它):

{
"title": "My Really Useful Class Library",
"copyright": "Copyright © 2015-16 Tigra Astronomy, all rights reserved",
"description": "Really neat stuff",
"language": "en-GB",
"version": "1.0.0-*",
"dependencies": {
    "JetBrains.Annotations": "10.1.4",
    },
"frameworks": {
    "netstandard1.5": {
        "imports": "dnxcore50",
        "dependencies": {
            "NETStandard.Library": "1.5.0-rc2-24027",
            "System.Linq.Expressions": "4.0.11-rc2-24027"
            }
        }
    "net46": {
        "frameworkAssemblies": {
            "System.Collections": "4.0.*"
            },
        "dependencies": {}
        }
    },
    "buildOptions": {
        "xmlDoc": true
        }
}

我接下来要做的是在同一个解决方案中创建我的 .NET Framework 4.6 项目,并尝试引用类库。它让我可以添加引用,但我遇到了构建错误、未解析的符号、R# 不满意等。

我想我做的不对(毫不奇怪,真的,因为我在黑暗中摸索)。

我已经阅读了一些关于 TFM、框架和库的文档,但没有一个真正有意义。

我真正需要在我的类库中放入什么project.json,以便我可以从我的 .net framework 4.6 应用程序以及 UWP 和 ASP.NET Core RC2 应用程序中引用它?这真的是正确的方法还是我一开始就走错了路?

4

2 回答 2

34

现在有两种创建 C# 项目的方法:xprojcsproj. 假设我们同时使用project.json它们,那么项目类型的工作方式仍然不同——因为xprojproject.json包含构建项目所需的一切;对于csproj,它只包含 nuget 依赖项。

也就是说,某些项目类型(如 UWP)无法使用 xproj 构建,因为它需要比xproj/project.json支持的更复杂的构建管道。(顺便说一句,这是回到 msbuild 的一个关键原因。)

还有两种创建基于 .NET Standard 的类库的方法:您可以使用xprojwith project.json,就像您所做的那样,或者您可以创建一个常规的csproj“可移植类库”项目。使用 VS 2015 Update 3 RC,您可以将 PCL 更改为针对 .NET Standard 版本(netstandard1.x而不是 PCL 配置文件、259 等)。

如果您使用csproj基于 的类库来定位netstandard1.x,那么在添加项目引用时,事情应该对您有用。请注意,UWP 目前最多支持netstandard1.4基于平台的地图。挑战在于您是否想改用基于xproj/project.json的项目。今天使用的一个关键原因xproj是支持多个目标框架之间的交叉编译。也就是说,从您的项目中创建多个输出。这与创建可以从任何兼容项目引用的单个输出不同。两者都有其用途,这取决于您的需求。

如果您决定创建xproj基于 - 的类库,如果“添加引用”对话框不起作用(它不是csproj->xproj几乎坏了)。不要使用对话框,而是编辑您的 UWPcsproj以指向如下输出xproj

<Reference Include="System.Reactive.Interfaces">
  <HintPath>..\System.Reactive.Interfaces\bin\$(Configuration)\netstandard1.0\System.Reactive.Interfaces.dll</HintPath>
</Reference>

上面的代码片段取自 Rx.NET UWP Test Runner here

如果这样做,您还需要将 UWP 项目中的构建依赖项添加到 xproj,因为 MSBuild/Visual Studio 不会知道它并以错误的顺序构建事物。为此,请在解决方案资源管理器中右键单击您的 UWP 项目,然后选择“构建依赖项 -> 项目依赖项”。在该对话框中,选中 xproj 的复选框,以确保 VS/MSbuild 知道首先构建那个。

您可以在此处查看完整的 Rx.NET 解决方案,其中包括我上面提到xproj->xproj的参考资料和 UWP ->xproj参考资料。

于 2016-06-19T13:55:21.550 回答
3

新项目模板/.xproj 的工作方式略有不同。新的类库(和应用程序模板)生成 nuget 包,而不是普通程序集。

在该 nuget 包中,所有目标都打包到其中。话虽如此,添加新项目的方式与添加任何其他 nuget 包的方式相同:将 nuget 放入 nuget 提要中,在 Visual Studio 中引用它,然后从那里获取它。

如果您没有运行 nuget 服务器(Visual Studio Team Services + NuGet 包、myget、自托管),您还可以将包放入文件夹(本地或网络共享)并将此文件夹添加为 nuget 源。

如果这“太多”工作,您还可以在一个文件夹中创建两个项目:一个 *.csproj 和一个 *.xproj。*.csproj 以 .NET 4.6 Framework 为目标,而 *.xproj 保持如您在上面指出的那样并具有多个目标。使用此设置,您通常可以通过简单地添加引用来以以前使用的方式引用项目(如果它们在同一解决方案中)。

于 2016-06-19T00:30:10.413 回答