Can someone explain the purpose of this two in csproj file (VS2017):
<TargetFramework>netstandard1.6</TargetFramework> <RuntimeIdentifier>win7</RuntimeIdentifier>
I just migrated from VS2015 and now can't publish my web api because it looks I should use only one target framework. In addition I can't specify multiple RIDs. All these changed things make me frustrated. Nothing works from scratch, should overcome something over and over.
I just want developing my web-api on windows, run xUnit tests here and then deploy web-api to run on linux (ubuntu) server. What I should put in both parameters in csproj ? Links with good explanation is highly appreciated.
Update1
I have web api with referenced .net core libraries. Everything where migrated from VS2015. Now in root project I have <TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>
. When I publish via VS2017 I got error:
C:\Program Files\dotnet\sdk\1.0.3\Sdks\Microsoft.NET.Sdk\buildCrossTargeting\Microsoft.NET.Sdk.targets(31,5): error : The 'Publish' target is not supported without specifying a target framework. The current project targets multiple frameworks, please specify the framework for the published application.
But I have specified target framework in publish as netcoreapp1.1
. OK. Then I updated my csproj with <PropertyGroup Condition="$(TargetFramework)'=='netcoreapp1.1'"> <RuntimeIdentifier>ubuntu.16.10-x64</RuntimeIdentifier> </PropertyGroup>
as suggested below. But now I even can't build app, get error:
5>C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.Sdk.targets(92,5): error : Assets file '\obj\project.assets.json' doesn't have a target for '.NETCoreApp,Version=v1.1/ubuntu.16.10-x64'. Ensure you have restored this project for TargetFramework='netcoreapp1.1' and RuntimeIdentifier='ubuntu.16.10-x64'.
I just want develop with VS2017 at windows 8.1/windows7 and deploy to ubuntu 16.10. What I'm doing wrong ?
Update2
I have 8 projects in solution. 3 of them are xUnit tests. Thus we have 5 projects. 4 of these 5 are class libraries and 1 is my web-app. All 4 class libraries have this:
<TargetFrameworks>netstandard1.6;net461</TargetFrameworks> <ItemGroup Condition=" '$(TargetFramework)' == 'net461' "> <Reference Include="System" /> <Reference Include="Microsoft.CSharp" /> </ItemGroup>
My web app:
<TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks> <ItemGroup Condition=" '$(TargetFramework)' == 'net461' "> <Reference Include="System" /> <Reference Include="Microsoft.CSharp" /> </ItemGroup>
How to publish my web-app ?
Net doesn't change the . Net Core architecture, but adds some additional benefits including Core Runtime & API Performance enhancement, and deployment flexibility. . Net 5 also supports some major sub-framework for desktop development like Entity Framework, GDI+, LINQ, and ADO.Net.
When you target a framework in an app or library, you're specifying the set of APIs that you'd like to make available to the app or library. You specify the target framework in your project file using a target framework moniker (TFM). An app or library can target a version of .
RID is short for Runtime Identifier. RID values are used to identify target platforms where the application runs. They're used by . NET packages to represent platform-specific assets in NuGet packages. The following values are examples of RIDs: linux-x64 , ubuntu.
NET Core is cross-platform. It runs on Windows, OS X and multiple distributions of Linux. It also supports different CPU architectures.
The <TargetFramework>
(or <TargetFrameworks>
when you want have multiple targets, such as net451
, one or multiple netstandard1.x
etc). Per <TargetFramework>
/ <TargetFrameworks>
entry one set of assemblies will be created and located inside bin\Debug\<targetframeworkid>
).
This is useful, when you want to use a different library in .NET Core (because the library you used only works with full .NET Framework such as 4.5.1) or remove this feature from i.e. .NET Core because it's unsupported.
It is used for both, building and NuGet restore. i.e. you can't use a net451
only library in a .NET Core project (netstandard 1.1
for example - but you can use netstandard1.1
in a net451
project).
<RuntimeIdentifier>
/ <RuntimeIdentifiers>
on the other side is used for NuGet mainly. It tells NuGet which packages you need. For example if you want to target Linux, Mac and Windows, certain assemblies require native libraries (such as encryption. On windows CryptoAPI will be used, but on Linux and Mac you need OpenSSL). This includes non-managed dlls and *.so (Linux) files.
i.e. <RuntimeIdentifiers>win7-x64;win7-x86;ubuntu.16.10-x64</RuntimeIdentifiers>
will make nuget restore packages for win7 (both x64 and x86) versions and x64 only for ubuntu. This is required, because when you work on windows you need to download these native libraries too so you deploy/package them with dotnet publish
.
Here's a little catch though: When you have a full .NET Framework reference in <TargetFramework>
or <TargetFrameworks>
, then you must specify a single <RuntimeIdentifier>
(singular, not plural <RuntimeIdentifiers>
), otherwise you will get an error.
For example:
<PropertyGroup> <TargetFrameworks>netstandard1.0;net451</TargetFrameworks> <RuntimeIdentifiers>win7-x64;win7-x86;ubuntu.16.10-x64</RuntimeIdentifiers> </PropertyGroup> <!-- This entry will only be used for the .NET Framework 4.5.1 output --> <PropertyGroup Condition="'$(TargetFramework)' == 'net451'"> <RuntimeIdentifier>win7-x64</RuntimeIdentifier> </PropertyGroup>
RID is short for Runtime IDentifier. RIDs are used to identify target operating systems where an application or asset (that is, assembly) will run. They look like this: "ubuntu.14.04-x64", "win7-x64", "osx.10.11-x64". For the packages with native dependencies, it will designate on which platforms the package can be restored.
More in docs
First change to proper RID from win7
to win7-x64
or win7-x86
. Next add other RID like ubuntu. For example:
<PropertyGroup> <TargetFramework>netstandard1.6</TargetFramework> <RuntimeIdentifier>win7-x64;ubuntu.16.10-x64</RuntimeIdentifier> </PropertyGroup>
Target framework looking good. For more read docs
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With