更新:我没有任何好的答案,所以我要澄清我的问题,并添加一个赏金.我也问过ASP.NET核心论坛,但没有回应.
>如果我指定一个win7-x32的RID,我的代码也会运行在64位Windows操作系统上?
>如果我指定一个RID的win7,它是如何构建的,它会构建32位版本还是64位版本?
>如果我指定一个RID的win7,我的程序将在Windows 8,8.1或10中运行?
>什么是RID?我了解如何在多个平台上使用便携式部署,但如何在Linux以及Windows上独立部署(使用任何RID构建)可以工作?我误解了这个RID吗?
>如果我指定一个RID的blah我预计有一个错误.相反,我的应用程序内置在bin / Release / blah目录中.它只是默认一些其他运行时?
解决方法
RID在兼容性树的林中定义,树中的任何节点表示可以支持其所有子项的执行环境.每个RID都是这样一棵树的根.
这是一个RID兼容性树示例:
win10-x64 |- win10 | `- win81 | `- win8 | `- win7 | `- win | `- any | `- base `- win81-x64 |- win81 (already included above) `- win8-x64 |- win8 (already included above) `- win7-x64 |- win7 (already included above) `- win-x64 `- win (already included above)
这里定义了RID兼容性树的完整图形:
https://github.com/dotnet/corefx/blob/master/pkg/Microsoft.NETCore.Platforms/runtime.json
如果需要,一个包可以为每个RID提供不同的实现.构建时,如果我对该包有依赖关系,构建过程将选择最靠近树根的实现.如果树不包含包提供的任何RID,则构建将失败.
有一种特殊的包称为“运行时包”.运行时软件包包含由主机操作系统直接加载和执行的本机二进制文件.因此,这些软件包仅提供具体操作系统版本的实现:例如“win7-x64”,但不提供“win7”或“win-x64”,也可以是“ubuntu.16.04-x64”,而不是“ubuntu .16.04“,”ubuntu-x64“或”linux“.
绑定独立项目时,运行时软件包会发挥作用.使用独立的项目,运行项目所需的一切都必须包含在构建输出中.这意味着构建输出必须包含本机二进制文件作为应用程序的入口点.该本地二进制文件由运行时包提供.
所以,解决你的问题:
- If I specify a RID of win7-x32 will my code also run on a 64 bit Windows OS?
是的,但它将运行在32位进程.我已经通过一个应用程序构建&从Ubuntu dev VM发布,随后在Windows 10 64位上运行;如果应用程序是针对win7-x32发布的,那么IntPtr.Size是4,如果它是针对win7-x64发布的,那么IntPtr.Size是8.它以任何一种方式运行.
win7-x32运行时包包含一个32位EXE文件,它承载.NET Core运行时,然后加载&运行您的项目,它与它一起捆绑在一个具有相同名称的DLL文件中.
- If I specify a RID of win7,what does it build,will it build the 32 bit version or the 64 bit version?
如果您指定了一个win7的RID,它将尝试查找使用该RID或兼容的RID标记的本机二进制生成,但是找不到任何的.构建将失败,因为没有主要入口点EXE的“win7”版本.您必须指定32位或64位(看起来所有其他平台只有64位).
我已经测试了这个具体细节,并发现:
> dotnet还原步骤不会失败,但也不会为win7(或win10)安装运行时.
> dotnet构建步骤成功编译测试应用程序,但会发出此错误:
Failed to make the following project runnable: helloworld (.NETCoreApp,Version=v1.1) reason: Expected coreclr library not found in package graph. Please try running dotnet restore again.
- If I specify a RID of win7,will my program run in Windows 8,8.1,or 10?
假设您指定win7-x86或win7-x64,那么是. win7-x86或win7-x64运行时软件包将分别提供一个EXE入口点,它是一个32位或64位EXE,这些EXE是从Windows 7开始的任何Windows版本上运行的本机二进制文件.
请注意,目前没有针对Windows 8,Windows 8.1或Windows 10的运行时间包.适用于较新版本的Windows版本的兼容性图表包括win7-x86或win7-x64,并且即使您定位到较新的RID(例如win10-x64),特定的运行时包也将在构建中使用.
- What does the any RID do? I understand how the portable deployment can be used on multiple platforms but how can the standalone deployment (built with a RID of any) work on Linux as well as Windows? Am I misunderstanding this RID?
任何RID都允许一个软件包为链路中的任何RID提供一个实现,因为所有其他RID最终都包含在它们的兼容性树中的任何(和基础).但是,运行时软件包不提供任何实现,因此任何不能用于构建独立软件包.
- If I specify a RID of blah I expected an error. Instead my application was built in the bin/Release/blah directory. Did it simply default to some other runtime?
您的项目必须配置为依赖Microsoft.NETCore.App的“类型”:“平台”.因此,没有构建独立的包,并且支持库的解决方案被保留到运行时,此时RID由您用于运行应用程序的实际运行时提供,而不是由应用程序的构建配置提供.
如果您的项目是一个图书馆,那么当您尝试从另一个项目引用它时,您可能会遇到问题,因为您的图书馆只提供“blah”平台的实现,这不会在RID的兼容性树中其他项目正在反对.如果你的项目是一个应用程序,那么blah被忽略.
如果您重新配置项目以生成独立的软件包(通过删除或注释project.json中的“类型”:“平台”行),您将发现它不再生成,因为它现在具有依赖于运行时包,并且没有RID blah的包.