.NET Core RuntimeIdentifier与TargetFramework

时间:2017-04-20 12:34:13

标签: asp.net-core .net-core visual-studio-2017 asp.net-core-webapi runtime-identifier

有人可以在csproj文件(VS2017)中解释这两个目的:

<TargetFramework>netstandard1.6</TargetFramework>
<RuntimeIdentifier>win7</RuntimeIdentifier>

我刚从VS2015迁移,现在无法发布我的web api,因为它看起来我应该只使用一个目标框架。另外我不能指定多个RID。 所有这些改变的事情让我感到沮丧。没有什么可以从头开始,应该一遍又一遍地克服一些东西。

我只想在Windows上开发我的web-api,在这里运行xUnit测试,然后部署web-api以在linux(ubuntu)服务器上运行。 我应该在csproj的两个参数中加入什么? 非常感谢与良好解释的链接。

UPDATE1

我有带引用的.net核心库的web api。从VS2015迁移的所有东西。现在我有根项目 <TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>。当我通过VS2017发布时出现错误:

  

C:\程序   文件\ DOTNET \ SDK \ 1.0.3 \的SDK \ Microsoft.NET.Sdk \ buildCrossTargeting \ Microsoft.NET.Sdk.targets(31,5):   错误:如果未指定a,则不支持“发布”目标   目标框架。当前项目针对多个框架,   请指定已发布申请的框架。

但是我已将发布中的目标框架指定为netcoreapp1.1。 好。然后我按照下面的建议用<PropertyGroup Condition="$(TargetFramework)'=='netcoreapp1.1'"> <RuntimeIdentifier>ubuntu.16.10-x64</RuntimeIdentifier> </PropertyGroup>更新了我的csproj。 但现在我甚至无法构建app,得到错误:

  

5&gt; C:\ Program Files(x86)\ Microsoft Visual   工作室\ 2017 \企业\的MSBuild \的SDK \ Microsoft.NET.Sdk \建立\ Microsoft.NET.Sdk.targets(92.5):   错误:资产文件'\ obj \ project.assets.json'没有   有一个'.NETCoreApp,Version = v1.1 / ubuntu.16.10-x64'的目标。确保   你已经为TargetFramework ='netcoreapp1.1'恢复了这个项目   RuntimeIdentifier = 'ubuntu.16.10-64'。

我只想在Windows 8.1 / windows7上使用VS2017进行开发并部署到ubuntu 16.10。 我做错了什么?

UPDATE2

我有8个项目在解决方案中。其中3个是xUnit测试。因此我们有5个项目。这5个中的4个是类库,1个是我的web-app。 所有4个类库都有:

<TargetFrameworks>netstandard1.6;net461</TargetFrameworks>    
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <Reference Include="System" />
    <Reference Include="Microsoft.CSharp" />
</ItemGroup>

我的网络应用:

<TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <Reference Include="System" />
    <Reference Include="Microsoft.CSharp" />
  </ItemGroup>

如何发布我的网络应用程序?

2 个答案:

答案 0 :(得分:15)

<TargetFramework>(或<TargetFrameworks>,如果您想要多个目标,例如net451,一个或多个netstandard1.x等。每<TargetFramework> / <TargetFrameworks>个条目将创建一组程序集并位于bin\Debug\<targetframeworkid>内。

当您想在.NET Core中使用不同的库(因为您使用的库仅适用于完整的.NET Framework,如4.5.1)或从.NET Core中删除此功能时,这很有用,因为它不受支持。

它用于构建和NuGet还原。即,您不能在.NET Core项目中使用仅net451库(例如netstandard 1.1 - 但您可以在netstandard1.1项目中使用net451

另一方的

<RuntimeIdentifier> / <RuntimeIdentifiers>主要用于NuGet。它告诉NuGet您需要哪些包。例如,如果您想要定位Linux,Mac和Windows,某些程序集需要本机库(例如加密。在Windows上将使用CryptoAPI,但在Linux和Mac上则需要OpenSSL)。这包括非托管dll和* .so(Linux)文件。

即。 <RuntimeIdentifiers>win7-x64;win-7x86;ubuntu.16.10-x64</RuntimeIdentifiers>将为win7(x64和x86)版本生成nuget恢复包,仅为ubuntu生成x64。这是必需的,因为当您在Windows上工作时,您还需要下载这些本机库,以便使用dotnet publish部署/打包它们。

虽然这里有一点看法:当你在<TargetFramework><TargetFrameworks>中有完整的.NET Framework参考时,你必须指定一个<RuntimeIdentifier>(单数,而不是复数{{1} }),否则你会得到一个错误。

例如:

<RuntimeIdentifiers>

答案 1 :(得分:1)

  

RID是Runtime IDentifier的缩写。 RID用于识别目标   应用程序或资产(即程序集)的操作系统   会跑。它们看起来像这样:“ubuntu.14.04-x64”,“win7-x64”,   “osx.10.11-64”。对于具有本机依赖关系的包,它会   指定可以恢复包的平台。

docs

中的更多内容

首先更改为win7win7-x64win7-x86的正确RID。接下来添加像ubuntu这样的其他RID。例如:

<PropertyGroup>
    <TargetFramework>netstandard1.6</TargetFramework>
    <RuntimeIdentifier>win7-x64;ubuntu.16.10-x64</RuntimeIdentifier>
</PropertyGroup>

目标框架看起来不错。更多阅读docs