我正在构建一个C#.NET核心应用程序,它正在瞄准net452
框架.当我发布时,我可以指定一个运行时( - runtime),如果我没有指定它使用的任何运行时win7-x64
(我认为那是因为那是我的机器正在运行的).但是,我也可以手动指定运行时,它似乎接受我给它的任何字符串.然而,RID目录似乎表明两者win
,以及any
是否有效.
更新:我没有任何好的答案,所以我将澄清我的问题,并添加一个赏金.我也曾在ASP.NET核心论坛上问过,但没有得到回应.
如果我指定RID,win7-x32
我的代码也会在64位Windows操作系统上运行吗?
如果我指定一个RID win7
,它构建了什么,它将构建32位版本还是64位版本?
如果我指定RID win7
,我的程序将在Windows 8,8.1或10中运行吗?
什么是any
RID吗?我理解可移植部署如何在多个平台上使用,但独立部署(使用RID构建any
)如何在Linux和Windows上运行?我误解了这个RID吗?
如果我指定一个blah
我预期错误的RID .相反,我的应用程序是在bin/Release/blah
目录中构建的.它只是默认为其他运行时吗?
Jonathan Gil.. 31
RID与.NET Core一起使用以解决对包的依赖性.解析依赖项的此过程的根是您的项目,您使用一个或多个RID明确标记该项目.构建项目时,您可以指出要构建的RID.
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".
[ 更新:从.NET Core 2.0开始,您可以构建Linux-x64以使用单个版本来定位"所有"x64版本的Linux.请参阅https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-net-core-2-0/ ]
捆绑独立项目时,运行时包就会发挥作用.对于独立项目,运行项目所需的所有内容都必须包含在构建输出中.这意味着构建输出必须包含本机二进制文件作为应用程序的入口点.该本机二进制文件由运行时包提供.
所以,要解决你的问题:
如果我指定一个win7-x32的RID,我的代码也可以运行在64位Windows操作系统上吗?
是的它会,但它将以32位进程运行.我已经使用从Ubuntu dev VM构建和发布的应用程序验证了这一点,随后在Windows 10 64位上运行; 如果应用程序是针对发布的win7-x32
,那么IntPtr.Size
是4,如果是针对它发布的win7-x64
,IntPtr.Size
则为8.它以任何一种方式运行.
在win7-x32
运行时包包括承载.NET核心运行时再加载运行与你的项目,这是在用相同名称的DLL文件捆绑在它旁边一个32位的EXE文件.
如果我指定一个win7的RID,它构建了什么,它会构建32位版本还是64位版本?
如果您指定RID win7
,它将尝试查找使用该RID或兼容的RID标记的本机二进制版本,但它将找不到任何RID.构建将失败,因为主入口点EXE没有"win7"版本.您必须指定32位或64位(并且看起来所有其他平台仅为64位).
我测试了这个具体的细节,并发现:
该dotnet restore
步骤不会失败,但也不会为win7
(或win10
)安装运行时.
该dotnet build
步骤成功编译了测试应用程序,但随后发出此错误:
无法使以下项目可运行:helloworld(.NETCoreApp,Version = v1.1)原因:在包图中找不到预期的coreclr库.请尝试再次运行dotnet restore.
如果我指定一个win7的RID,我的程序将在Windows 8,8.1或10中运行吗?
假设你指定了win7-x86
或者win7-x64
,那么是.的win7-x86
或win7-x64
运行时包将提供一个EXE入口点是一个32位或64位EXE,分别与那些EXE文件是将在任何Windows版本上运行开始与Windows 7本机二进制文件.
请注意,目前没有专门针对Windows 8,Windows 8.1或Windows 10的运行时包.较新的Windows版本的兼容性图表包括win7-x86
或者win7-x64
,视情况而定,以便特定的运行时包最终在构建中使用,即使您定位较新的RID,例如win10-x64
.
什么RID做什么?我理解可移植部署如何在多个平台上使用,但独立部署(使用任何RID构建)如何在Linux和Windows上运行?我误解了这个RID吗?
的any
RID允许包提供一个实现为任何RID进一步向上链的,因为所有其它的RID包括最终any
(和base
)中的相容性的树.但是,运行时包不提供任何实现any
,因此any
不能用于构建独立包.
如果我指定一个blah的RID,我预计会出错.相反,我的应用程序是在bin/Release/blah目录中构建的.它只是默认为其他运行时吗?
您的项目必须"type": "platform"
在依赖项中配置Microsoft.NETCore.App
.因此,没有构建独立包,并且支持库的解析留给运行时,此时RID由用于运行应用程序的实际运行时提供,而不是由应用程序的构建配置提供.
如果你的项目是一个库,那么当你尝试从另一个项目引用它时,你可能会遇到问题,因为你的库只提供了一个"blah"平台的实现,它不会出现在RID的兼容性树中.其他项目正在建设中.如果您的项目是一个应用程序,那么blah
将被忽略.
如果重新配置项目以生成独立包(通过删除或注释掉"type": "platform"
行project.json
),您会发现它不再构建,因为它现在依赖于运行时包,并且没有RID包blah
.
RID与.NET Core一起使用以解决对包的依赖性.解析依赖项的此过程的根是您的项目,您使用一个或多个RID明确标记该项目.构建项目时,您可以指出要构建的RID.
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".
[ 更新:从.NET Core 2.0开始,您可以构建Linux-x64以使用单个版本来定位"所有"x64版本的Linux.请参阅https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-net-core-2-0/ ]
捆绑独立项目时,运行时包就会发挥作用.对于独立项目,运行项目所需的所有内容都必须包含在构建输出中.这意味着构建输出必须包含本机二进制文件作为应用程序的入口点.该本机二进制文件由运行时包提供.
所以,要解决你的问题:
如果我指定一个win7-x32的RID,我的代码也可以运行在64位Windows操作系统上吗?
是的它会,但它将以32位进程运行.我已经使用从Ubuntu dev VM构建和发布的应用程序验证了这一点,随后在Windows 10 64位上运行; 如果应用程序是针对发布的win7-x32
,那么IntPtr.Size
是4,如果是针对它发布的win7-x64
,IntPtr.Size
则为8.它以任何一种方式运行.
在win7-x32
运行时包包括承载.NET核心运行时再加载运行与你的项目,这是在用相同名称的DLL文件捆绑在它旁边一个32位的EXE文件.
如果我指定一个win7的RID,它构建了什么,它会构建32位版本还是64位版本?
如果您指定RID win7
,它将尝试查找使用该RID或兼容的RID标记的本机二进制版本,但它将找不到任何RID.构建将失败,因为主入口点EXE没有"win7"版本.您必须指定32位或64位(并且看起来所有其他平台仅为64位).
我测试了这个具体的细节,并发现:
该dotnet restore
步骤不会失败,但也不会为win7
(或win10
)安装运行时.
该dotnet build
步骤成功编译了测试应用程序,但随后发出此错误:
无法使以下项目可运行:helloworld(.NETCoreApp,Version = v1.1)原因:在包图中找不到预期的coreclr库.请尝试再次运行dotnet restore.
如果我指定一个win7的RID,我的程序将在Windows 8,8.1或10中运行吗?
假设你指定了win7-x86
或者win7-x64
,那么是.的win7-x86
或win7-x64
运行时包将提供一个EXE入口点是一个32位或64位EXE,分别与那些EXE文件是将在任何Windows版本上运行开始与Windows 7本机二进制文件.
请注意,目前没有专门针对Windows 8,Windows 8.1或Windows 10的运行时包.较新的Windows版本的兼容性图表包括win7-x86
或者win7-x64
,视情况而定,以便特定的运行时包最终在构建中使用,即使您定位较新的RID,例如win10-x64
.
什么RID做什么?我理解可移植部署如何在多个平台上使用,但独立部署(使用任何RID构建)如何在Linux和Windows上运行?我误解了这个RID吗?
的any
RID允许包提供一个实现为任何RID进一步向上链的,因为所有其它的RID包括最终any
(和base
)中的相容性的树.但是,运行时包不提供任何实现any
,因此any
不能用于构建独立包.
如果我指定一个blah的RID,我预计会出错.相反,我的应用程序是在bin/Release/blah目录中构建的.它只是默认为其他运行时吗?
您的项目必须"type": "platform"
在依赖项中配置Microsoft.NETCore.App
.因此,没有构建独立包,并且支持库的解析留给运行时,此时RID由用于运行应用程序的实际运行时提供,而不是由应用程序的构建配置提供.
如果你的项目是一个库,那么当你尝试从另一个项目引用它时,你可能会遇到问题,因为你的库只提供了一个"blah"平台的实现,它不会出现在RID的兼容性树中.其他项目正在建设中.如果您的项目是一个应用程序,那么blah
将被忽略.
如果重新配置项目以生成独立包(通过删除或注释掉"type": "platform"
行project.json
),您会发现它不再构建,因为它现在依赖于运行时包,并且没有RID包blah
.
我相信与OP相关的官方文件提供了所有必要的信息.
首先要做的事情
什么是RID?
RID是Runtime IDentifier的缩写.RID用于标识将运行应用程序或资产(即程序集)的目标操作系统.
值得注意的是,RID实际上是不透明的字符串.这意味着它们必须完全匹配使用它们才能工作的操作.
这也引自GitHub
RID是标识平台的不透明字符串.RID通过"导入"其他RID与其他RID建立关系.以这种方式,RID是兼容RID的有向图.
最佳RID考虑部分RID图:
"any": {}, "win": { "#import": [ "any" ] }, "win-x86": { "#import": [ "win" ] }, "win-x64": { "#import": [ "win" ] }, "win7": { "#import": [ "win" ] }, "win7-x86": { "#import": [ "win7", "win-x86" ] }, "win7-x64": { "#import": [ "win7", "win-x64" ] }这可以被视为有向图,如下所示:
win7-x64 win7-x86 | \ / | | win7 | | | | win-x64 | win-x86 \ | / win | any因此,最好的RID,在评估WIN7-64将是:
win7-x64
,win7
,win-x64
,win
,any
同样,在评估的时候win-x64
:win-x64
,win
,any
注意win7
到来之前win-x64
,由于进口的win7
进口出庭的win-x64
文档顺序.
也就是说,并参考runtime.json
CoreFX repo.
如果您使用此文件,您会注意到某些RID中包含"#import"语句.这些语句是兼容性声明.这意味着在其中具有导入的RID的RID可以是用于恢复该RID的包的目标.
仅提取相关部分,
1)如果我指定RID,
win7-x32
我的代码也可以在64位Windows操作系统上运行吗?
"base": { }, "any": { "#import": [ "base" ] }, ... "win": { "#import": [ "any" ] }, ... "win7": { "#import": [ "win" ] }, "win7-x86": { "#import": [ "win7", "win-x86" ] }, "win7-x64": { "#import": [ "win7", "win-x64" ] }, ...
2)如果我指定了win7的RID,它构建了什么,它会构建32位版本还是64位版本?
它将构建一个可以在两个平台上运行的通用版本.请参阅上面的可视化.
3)如果我指定了win7的RID,我的程序将在Windows 8,8.1或10中运行吗?
是.基于引用版本的导入.
"win8": { "#import": [ "win7" ] }, "win8-x86": { "#import": [ "win8", "win7-x86" ] }, "win8-x64": { "#import": [ "win8", "win7-x64" ] }, "win8-arm": { "#import": [ "win8" ] }, "win81": { "#import": [ "win8" ] }, "win81-x86": { "#import": [ "win81", "win8-x86" ] }, "win81-x64": { "#import": [ "win81", "win8-x64" ] }, "win81-arm": { "#import": [ "win81", "win8-arm" ] }, "win10": { "#import": [ "win81" ] }, "win10-x86": { "#import": [ "win10", "win81-x86" ] }, "win10-x64": { "#import": [ "win10", "win81-x64" ] },
4)
any
RID有什么作用?
这意味着构建与any
支持的平台兼容,并且它可以是恢复任何RID的包的目标.
5)如果我指定一个
blah
我预期错误的RID .相反,我的应用程序是在bin/Release/blah directory
.它只是默认为其他运行时吗?
引用表单文档:
所有RID最终都映射回根
any
RID.
最后,再次从文档中注意
虽然它们看起来很容易使用,但是在使用它们时你必须记住一些关于RID的特殊事项:
它们是不透明的字符串,应该被视为黑盒子
您不应该以编程方式构造RID
您需要使用已为平台定义的RID,本文档将显示该RID
RID确实需要具体,所以不要假设实际的RID值; 请参阅此文档以确定给定平台所需的RID