32

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

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

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

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

更新1

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

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 specified a目标框架。当前项目针对多个框架,请为发布的应用指定框架。

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

5>C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Sdks\Microsoft.NET.Sdk\build\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-x64' 恢复此项目。

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

更新2

我有 8 个项目在解决方案中。其中 3 个是 xUnit 测试。因此,我们有 5 个项目。这 5 个中的 4 个是类库,1 个是我的网络应用程序。所有 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>

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

4

2 回答 2

28

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

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

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

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

即将<RuntimeIdentifiers>win7-x64;win7-x86;ubuntu.16.10-x64</RuntimeIdentifiers>为win7(x64和x86)版本和x64仅针对ubuntu制作nuget恢复包。这是必需的,因为当您在 Windows 上工作时,您也需要下载这些本机库,以便使用dotnet publish.

不过这里有一个小问题:当您在<TargetFramework>or中有完整的 .NET Framework 引用时<TargetFrameworks>,您必须指定一个<RuntimeIdentifier>(单数,而不是复数<RuntimeIdentifiers>),否则会出错。

例如:

<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>
于 2017-04-20T12:49:08.443 回答
4

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

更多文档

首先从win7towin7-x64或更改为正确的 RID win7-x86。接下来添加其他 RID,如 ubuntu。例如:

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

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

于 2017-04-20T12:40:20.920 回答