Bed*_*ord 17 .net c# portable-class-library .net-standard
目前我的解决方案中有两个项目: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"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为.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.
Run Code Online (Sandbox Code Playgroud)
mez*_*tou 18
在针对完整框架的项目中引用.NET Standard无法正常工作.相反,您的项目必须以多个框架为目标.
如果您使用的是新工具(使用VS 2017),即csproj项目格式,则可以在TargetFrameworks标记中设置多个目标:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard1.3;net46</TargetFrameworks>
</PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
如果需要,可以为每个目标设置不同的依赖关系:
<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>
Run Code Online (Sandbox Code Playgroud)
默认情况下NETStandard.Library会自动添加.如果要删除它,请使用PackageReference Remove="NETStandard.Library"/>.
die*_*aus 17
应该可以从Windows类库引用.NET Core项目.但是,.NET标准库与以前版本的.NET Framework"不直接兼容",即4.6.1或更低版本..NET标准库是一个包含 .NET Framework 中已存在的组件的包(例如4.6.1).不同之处在于.NET标准库是为跨平台.NET标准框架构建的.
您可以"frameworks"在project.json文件中的部分下定位多个框架.
在执行此操作时,您还应该"NETStandard.Library"直接在"netstandard1.x"-framework 下移动-dependency.
示例project.json
{
"version": "1.0.0-*",
"dependencies": { },
"frameworks": {
"net461": { },
"netstandard1.3": {
"dependencies": {
"NETStandard.Library": "1.6.0"
},
"imports": "dnxcore50"
}
}
}
Run Code Online (Sandbox Code Playgroud)
这可以确保您不会包含任何对.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"
}
}
Run Code Online (Sandbox Code Playgroud)
正如@meziantou所描述:
在针对完整框架的项目中引用.NET Standard无法正常工作.
我刚刚在Visual Studio 2015中对它进行了测试,我可以确认 - 引用已添加,但您不能使用引用库的任何组件.
如果您没有安装Visual Studio 2017,我能想到的唯一解决方案是dotnet pack您的项目并将其发布到NuGet-feed.您可以为此设置本地NuGet源.
然后只需Install-Package在NuGet包管理器控制台中使用cmdlet.
Install-Package <your-package> -v 1.0.0-<x>
Run Code Online (Sandbox Code Playgroud)
包管理器将引用包的正确版本(.NET 4.6.1).
| 归档时间: |
|
| 查看次数: |
11138 次 |
| 最近记录: |