从Windows类库引用.NET标准库

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

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

这是.NET标准库项目的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. 

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

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

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

示例project.json

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

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

现在说,例如,您想要引用属于.NETStandard库的东西,而是.NET 4.6.1框架的一部分。 我工作场所的常见情况是System.ComponentModel.DataAnnotations 。 它是.NET Framework的一部分,但是.NET Standard框架的单独包。

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

示例project.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。 您可以为此目的设置本地NuGet源 。

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

 Install-Package  -v 1.0.0- 

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

在针对完整框架的项目中引用.NET Standard无法正常工作。 相反,您的项目必须以多个框架为目标。

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

   netstandard1.3;net46   

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

   netstandard1.3;net46           

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

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

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

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)

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