当前位置:  开发笔记 > 编程语言 > 正文

win /任何运行时在.NET Core中意味着什么

如何解决《win/任何运行时在.NETCore中意味着什么》经验,为你挑选了2个好方法。

我正在构建一个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中运行吗?

    什么是anyRID吗?我理解可移植部署如何在多个平台上使用,但独立部署(使用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-x86win7-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吗?

anyRID允许包提供一个实现为任何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.



1> Jonathan Gil..:

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-x86win7-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吗?

anyRID允许包提供一个实现为任何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.



2> Nkosi..:

我相信与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.jsonCoreFX 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)anyRID有什么作用?

这意味着构建与any支持的平台兼容,并且它可以是恢复任何RID的包的目标.

5)如果我指定一个blah我预期错误的RID .相反,我的应用程序是在bin/Release/blah directory.它只是默认为其他运行时吗?

引用表单文档:

所有RID最终都映射回根anyRID.

最后,再次从文档中注意

虽然它们看起来很容易使用,但是在使用它们时你必须记住一些关于RID的特殊事项:

它们是不透明的字符串,应该被视为黑盒子

您不应该以编程方式构造RID

您需要使用已为平台定义的RID,本文档将显示该RID

RID确实需要具体,所以不要假设实际的RID值; 请参阅此文档以确定给定平台所需的RID

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有