我搞不懂.NET 5中RuntimeIdentifier和PlatformTarget之间的关系。我的.NET 5 C#项目运行和发布都很好,但PlatformTarget是'AnyCPU‘,RuntimeIdentifier是'win-x64’。
在微软的文档中,RuntimeIdentifier是“用于识别应用程序运行的目标平台”。这不就是'PlatformTarget‘应该做的吗?
我尝试使用我以前见过的RuntimeIdentifers (复数)(也许是.NET Core3?),但是项目没有编译成这样:
<RuntimeIdentifiers>win-x64;win-x86</RuntimeIdentifiers>
从我当前的项目文件中:
<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>
发布于 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:
<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发布。
因此,您必须运行以下命令:
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
发布于 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命令行(覆盖项目文件值)。
https://stackoverflow.com/questions/68825789
复制相似问题