确实,一堆属性很难理解(Platform、Platforms、PlatformTarget、TargetFramework (Moniker) 和 RuntimeIdentifier)。这是我目前对这些属性的看法 - 请记住,由于我的实验结果,我仍然有疑问)。
Platform、Platforms 和 PlatformTarget:这些属性是一种同义词(Platforms 复数需要包含多个平台说明符),指的是位数/CPU 架构,例如 AnyCPU、x86、x64 和 Arm。我一直认为这个属性的“硬件”。
TargetFramework:这指定了应用程序打算在其上运行的 NET Framework API 版本(net48、net5.0、wp(Windows 手机)、netcore、netcoreapp2.1 等)。其中一些是跨平台的(跨硬件?)。
RuntimeIdentifier:运行时说明符是堆栈的跨平台粘合部分,位于抽象级别堆栈中:app->framework->runtime->platform。如果您的库同时配置为 x86 和 x64,msbuild 会将变体发布到 bin/debug/framework/win-x86/ 和 bin/debug/framework/win-x64/(以便 win-x86 和 win-64 以及其他运行时是输出文件夹树中的兄弟姐妹)。
您必须为您使用的每个运行时发布/构建一次项目(使用不同的属性值)。
对于原始问题,您可以看到 AnyCPU 是平台说明符,RID 是运行时标识符。为了方便交流,RID 名字对象通常在其名称中包含 x86/x64,但这些字符串并未指定平台。只有平台说明符可以说明平台。
在操作中,您可以指定 Platform AnyCPU 来构建应用程序(表明应用程序二进制适用于 x86、x64、arm 等,然后在发布操作中使用特定的运行时(将分配 32/64 位等)。到已发布的二进制文件)。
如果没有提供 MSBuild 覆盖参数,我的 NET 5 项目文件需要同时定义 Platform 和 TargetFramework。MSBuild 在我定义 Platform=AnyCPU 和 TargetFramework=net5.0-windows7.0 的项目上假定运行时为 win-x64。
值得一提的是,MSBuild 可以从三个地方获取其属性:MSBuild 项目文件;Visual Studio 对话框表(可能覆盖项目文件值;和 MSBuild 命令行(覆盖项目文件值)。