首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >.NET 5中PlatformTarget与RuntimeIdentifier的关系

.NET 5中PlatformTarget与RuntimeIdentifier的关系
EN

Stack Overflow用户
提问于 2021-08-18 02:07:26
回答 2查看 521关注 0票数 3

我搞不懂.NET 5中RuntimeIdentifier和PlatformTarget之间的关系。我的.NET 5 C#项目运行和发布都很好,但PlatformTarget是'AnyCPU‘,RuntimeIdentifier是'win-x64’。

在微软的文档中,RuntimeIdentifier是“用于识别应用程序运行的目标平台”。这不就是'PlatformTarget‘应该做的吗?

我尝试使用我以前见过的RuntimeIdentifers (复数)(也许是.NET Core3?),但是项目没有编译成这样:

代码语言:javascript
运行
复制
<RuntimeIdentifiers>win-x64;win-x86</RuntimeIdentifiers>

从我当前的项目文件中:

代码语言:javascript
运行
复制
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net5.0-windows</TargetFramework>
    <PublishSingleFile>true</PublishSingleFile>
    <SelfContained>true</SelfContained>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>   -> RuntimeIdentifier is required since SelfContained is 'true'
    ...
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    ...
    <PlatformTarget>AnyCPU</PlatformTarget>
  </PropertyGroup>
  ...
</Project>
EN

回答 2

Stack Overflow用户

发布于 2021-08-18 14:31:57

术语"AnyCPU“意味着它将拥有兼容32位和64位的二进制文件。这意味着它并不是专门针对32位和64位的,而且这个"AnyCPU“主要用于较早的.NET框架项目中,而不是通常用于主要用于.NET核心项目的SDK项目风格中。

这些.NET核心项目包括单个目标.NET核心项目或多目标.NET核心项目,例如具有多个目标的项目(通常称为TFM)。

因此,我们不应该将旧的"AnyCPU“与组合条件"Release|AnyCPU”一起使用。默认情况下,任何没有RID的TFM都与这些SDK项目模型中的AnyCPU相同。

例如,针对64位和32位的Windows5.0:

代码语言:javascript
运行
复制
<PropertyGroup>
  <TargetFramework>net5.0-windows;</TargetFramework>
  <RuntimeIdentifier>win-x64;win-x86</RuntimeIdentifier>
  <PublishSingleFile>true</PublishSingleFile>
  <SelfContained>true</SelfContained>
</PropertyGroup>

SDK项目具有属性Sdk="...“在header中,此SDK将驱动您的项目的引用解析。

我建议您删除那些具有旧的"Release|AnyCPU“或"Debug|AnyCPU”组合的PropertyGroup,因为这些组合的MSBuild项目语法与任何.NET Core SDK项目模型都不相关。

需要注意的一件事是,当您有多个类似于上面示例中的RID时,您必须为您支持的每个RID运行发布。

因此,为了同时拥有64位和32位,您必须分别为每个RID发布

因此,您必须运行以下命令:

代码语言:javascript
运行
复制
dotnet publish yourproject.csproj -r win-x64 
dotnet publish yourproject.csproj -r win-x86 

另请参阅发布单个文件可执行文件的官方文档:https://docs.microsoft.com/en-us/dotnet/core/deploying/single-file

票数 1
EN

Stack Overflow用户

发布于 2022-02-06 05:38:03

确实,这堆属性很难理解(Platform、Platforms、PlatformTarget、TargetFramework (绰号)和RuntimeIdentifier)。这是我目前对这些属性的看法-请记住,由于我的实验结果,我仍然有问题)。

Platform、Platforms和PlatformTarget:这些属性是某种同义词(Platforms需要复数才能包含多个平台说明符),它们指的是位/PlatformTarget架构,如AnyCPU、x86、x64和Arm。我总是认为这个属性是“硬件”。

TargetFramework:指定应用程序要在其上运行的NET Framework API版本(net48、net5.0、wp (windows phone)、netcore、netcoreapp2.1等)。其中一些是跨平台的(跨硬件?)。

RuntimeIdentifier:运行时说明符是堆栈的跨平台粘合部分,位于抽象级堆栈中:应用程序->框架->运行时->平台。如果您的库同时针对x86和x64进行了配置,则msbuild会将变体发布到bin/debug/framework/ win-x86 /和bin/debug/framework/win-x64/ (因此,win-x86和win-64以及其他运行时是输出文件夹树中的兄弟)。

只有平台说明符可以指定平台。

在操作中,您可以指定用于构建应用程序的平台AnyCPU (表示应用程序二进制文件适用于x86、x64、arm等),然后在发布操作中使用特定的运行时(这将为已发布的二进制文件分配32/64位等)。

如果没有提供MSBuild覆盖参数,我的NET5项目文件需要同时定义Platform和TargetFramework。在我定义Platform=AnyCPU和TargetFramework=net5.0-windows7.0的项目上,MSBuild假定运行时为win-x64。

值得一提的是,MSBuild可以从三个地方获得其属性: MSBuild项目文件;Visual Studio对话框工作表(可能覆盖项目文件值;以及MSBuild命令行(覆盖项目文件值)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68825789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档