【问题标题】:Referencing a .NET Standard library from a Windows Class Library从 Windows 类库中引用 .NET Standard 库
【发布时间】:2017-07-04 09:41:17
【问题描述】:

目前我的解决方案中有两个项目:一个Windows 类库(面向 .NET Framework 4.6.1) 和另一个面向 .NET Standard 1.3 的类库。我正在使用 Visual Studio 2015 Update 3。

我已经从另一个项目中添加了对 .NET Standard 项目的引用,它出现在引用列表中,但是当我想使用它们时,我看不到所引用库中的任何类或命名空间(即使引用的库已成功构建并且没有错误)。

这是 .NET Standard 库项目的 project.json:

{
  "version": "1.0.0-*",

  "dependencies": {
    "NETStandard.Library": "1.6.0"
  },

  "frameworks": {
    "netstandard1.3": {
      "imports": "dnxcore50"
    }
  }
}

我以为 .NET 4.6.1 项目可以使用 .NET Standard 1.3 库,我什至尝试使用较低版本(1.0),但结果是一样的。我在这里错过了什么?

如果我跑了

dotnet 恢复

它也可以正常工作:

log  : Restoring packages for C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Entities\project.json...
log  : Restoring packages for C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Parser\project.json...
log  : Writing lock file to disk. Path: C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Parser\project.lock.json
log  : C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Parser\PWBSpreadsheet.Parser.xproj
log  : Restore completed in 408ms.
log  : Writing lock file to disk. Path: C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Entities\project.lock.json
log  : C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Entities\PWBSpreadsheet.Entities.xproj
log  : Restore completed in 417ms.

【问题讨论】:

  • 运行“dotnet restore”时的输出是什么?
  • 我觉得没什么用,我已将其添加到问题的末尾。
  • Xenko 编辑器在游戏类库中使用 .NET Standard 4.0+ 库,然后在 Windows 主程序中使用 .NET Framework 4.6.2。我通常将它们设置为最高可用的目标。这是一个正在开发的开源图形游戏引擎,一旦在 Visual Studio 2013、2015 IDE 中打开,就可以在两个 C# 项目中设置 .NET Standard 1.0 和更低的 .NET Framework 版本。
  • .Net 标准库是 1.0 到 1.6 我可以设置,我只是检查并不能更改最后一个中的注释。
  • 我只是尝试降低到 .NET Standard 1.0 和 .NET Framework 4.6.1,不会编译 2 行。 { "supports": {}, "dependencies": { "Microsoft.NETCore.Portable.Compatibility": "1.0.1", "NETStandard.Library": "1.6.0" }, "frameworks": { "netstandard1.1": {} } } 我能达到的最低是 1.1

标签: c# .net portable-class-library .net-standard


【解决方案1】:

您不能在 PCL 项目中使用某些库,因为它不是作为 PCL 构建的,也不是跨平台的。某些命名空间在 PCL 项目中不可用且未列出 here

可移植类库项目中提供以下程序集:

mscorlib.dll

System.dll

System.Core.dll

System.Xml.dll

System.ComponentModel.Composition.dll

System.Net.dll

System.Runtime.Serialization.dll

System.ServiceModel.dll

System.Xml.Serialization.dll

System.Windows.dll (from Silverlight)

但是,并非所有平台都支持所有这些程序集。

【讨论】:

    【解决方案2】:

    应该可以从 Windows 类库中引用 .NET Core 项目应该。但是,.NET Standard 库与 .NET Framework 的早期版本(即 4.6.1 或更低版本)“不直接兼容”。 .NET Standard 库是一个,其中包含已经存在在 .NET Framework(例如 4.6.1)中的组件。不同之处在于 .NET Standard 库是为跨平台的 .NET Standard 框架构建的。

    您可以在 project.json 文件的 "frameworks" 部分下定位多个框架。

    在这样做的同时,您还应该将"NETStandard.Library"-dependency 直接移动到"netstandard1.x"-framework 下。

    示例项目.json

    {
      "version": "1.0.0-*",
    
      "dependencies": { },
    
      "frameworks": {
        "net461": { },
        "netstandard1.3": {
          "dependencies": {
            "NETStandard.Library": "1.6.0"
          },
          "imports": "dnxcore50"
        }
      }
    }
    

    这可确保您不会包含任何对 NET Standard 库的多余依赖项,因为这些依赖项仅在构建 NET Standard 框架时才会包含在内。如果针对 .NET Framework 4.6.1 构建,则会省略这些依赖项。这很好——因为这些依赖项已经是 .NET Framework 的一部分(如上所述)。

    现在假设您要引用的东西不是 .NETStandard 库的一部分,而是 .NET 4.6.1 框架的一部分。我工作场所的一个常见案例是System.ComponentModel.DataAnnotations。它是 .NET Framework 的一部分,但却是 .NET Standard 框架的一个单独包。

    您必须将其作为"net461"框架程序集 引用,但作为"netstandard1.x" 框架的依赖项

    示例项目.json

    "frameworks": {
      "net461": {
        "frameworkAssemblies": {
          "System.ComponentModel.DataAnnotations": "4.0.0.0"
        }
      },
      "netstandard1.3": {
        "dependencies": {
          "NETStandard.Library": "1.6.0",
          "System.ComponentModel.Annotations": "4.1.0"
        },
        "imports": "dnxcore50"
      }
    }
    

    正如@meziantou 描述的那样:

    在面向完整框架的项目中引用 .NET Standard 尚未正常工作。

    我刚刚在 Visual Studio 2015 中对其进行了测试,我可以确认 - 引用已添加,但您不能使用引用库的任何组件。

    如果您没有安装 Visual Studio 2017,我能想到的唯一解决方案是 dotnet pack 您的项目并将其发布到 NuGet-feed。您可以为此设置a local NuGet feed

    然后只需在 NuGet 包管理器控制台中使用 Install-Package cmdlet。

    Install-Package <your-package> -v 1.0.0-<x>
    

    包管理器将引用包的正确版本 (.NET 4.6.1)。

    【讨论】:

    • 谢谢你的详细解释,我想我还是等Visual Studio 2017发布吧。毕竟距离现在只有两周时间。
    • 然后——在那之后,仅仅几周时间,他们就会发布补丁,让它在某种程度上没有错误。 ;)
    • 由于 .net 标准迁移到 csproj,答案现在已过时
    • @trampster 这是真的,但是很多人仍然使用旧的(现在是旧的?)project.json,所以答案仍然相关。
    【解决方案3】:

    在面向完整框架的项目中引用 .NET Standard 尚未正常工作。相反,您的项目必须针对多个框架。

    如果您使用的是新工具(VS 2017),即csproj项目格式,您可以在TargetFrameworks标签中设置多个目标:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <TargetFrameworks>netstandard1.3;net46</TargetFrameworks>
      </PropertyGroup>
    </Project>
    

    如果需要,可以为每个目标设置不同的依赖:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <TargetFrameworks>netstandard1.3;net46</TargetFrameworks>
      </PropertyGroup>
    
      <ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.3'">
        <PackageReference Include="Microsoft.Win32.Primitives" Version="4.3.0" />
        <PackageReference Include="System.Collections" Version="4.3.0" />
        <PackageReference Include="System.Runtime.InteropServices" Version="4.3.0" />
      </ItemGroup>
    
      <ItemGroup Condition="'$(TargetFramework)' == 'net46'">
        <PackageReference Remove="NETStandard.Library" />
      </ItemGroup>
    </Project>
    

    默认情况下会自动添加NETStandard.Library。如果要删除它,请使用PackageReference Remove="NETStandard.Library"/&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 1970-01-01
      • 2017-01-06
      • 2019-06-26
      • 2017-07-11
      相关资源
      最近更新 更多