目前我的解决方案中有两个项目: 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 restore
它也可以正常工作:
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.
答案 0 :(得分:18)
在面向完整框架的项目中引用.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"/>
。
答案 1 :(得分:17)
可以从Windows类库引用.NET Core项目。但是,.NET标准库与以前版本的.NET Framework“不直接兼容”,即4.6.1或更低版本。 .NET标准库是一个包,其中包含已存在的组件在.NET Framework中(例如4.6.1)。不同之处在于.NET标准库是为跨平台.NET标准框架构建的。
您可以在project.json文件的"frameworks"
部分下定位多个框架。
在执行此操作时,您还应该直接在"NETStandard.Library"
- 框架下移动"netstandard1.x"
- 依赖项。
示例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标准框架的单独包。
然后,您必须将其作为"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。您可以为此目的设置a local NuGet feed。
然后只需在NuGet包管理器控制台中使用Install-Package
cmdlet。
Install-Package <your-package> -v 1.0.0-<x>
package-manager将引用该软件包的正确版本(.NET 4.6.1)。
答案 2 :(得分:2)
您不能在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)
但是,并非所有平台都支持所有这些程序集。