c# – 在.NET Core中,win / any运行时是什么意思
我正在构建一个C#.NET核心应用程序,它的目标是net452框架.当我发布我可以指定一个运行时(–runtime),如果我没有指定任何运行时它使用win7-x64(我认为是因为这是我的机器正在运行).但是,我也可以手动指定运行时,似乎接受任何我给它的字符串.然而,RID catalog似乎建议双赢以及任何一个都是有效的.
更新:我没有任何好的答案,所以我要澄清我的问题,并添加一个赏金.我也问过ASP.NET核心论坛,但没有回应. >如果我指定一个win7-x32的RID,我的代码也会运行在64位Windows操作系统上? 解决方法
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“. 绑定独立项目时,运行时软件包会发挥作用.使用独立的项目,运行项目所需的一切都必须包含在构建输出中.这意味着构建输出必须包含本机二进制文件作为应用程序的入口点.该本地二进制文件由运行时包提供. 所以,解决你的问题:
是的,但它将运行在32位进程.我已经通过一个应用程序构建&从Ubuntu dev VM发布,随后在Windows 10 64位上运行;如果应用程序是针对win7-x32发布的,那么IntPtr.Size是4,如果它是针对win7-x64发布的,那么IntPtr.Size是8.它以任何一种方式运行. win7-x32运行时包包含一个32位EXE文件,它承载.NET Core运行时,然后加载&运行您的项目,它与它一起捆绑在一个具有相同名称的DLL文件中.
如果您指定了一个win7的RID,它将尝试查找使用该RID或兼容的RID标记的本机二进制生成,但是找不到任何的.构建将失败,因为没有主要入口点EXE的“win7”版本.您必须指定32位或64位(看起来所有其他平台只有64位). 我已经测试了这个具体细节,并发现: > dotnet还原步骤不会失败,但也不会为win7(或win10)安装运行时.
假设您指定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),特定的运行时包也将在构建中使用.
任何RID都允许一个软件包为链路中的任何RID提供一个实现,因为所有其他RID最终都包含在它们的兼容性树中的任何(和基础).但是,运行时软件包不提供任何实现,因此任何不能用于构建独立软件包.
您的项目必须配置为依赖Microsoft.NETCore.App的“类型”:“平台”.因此,没有构建独立的包,并且支持库的解决方案被保留到运行时,此时RID由您用于运行应用程序的实际运行时提供,而不是由应用程序的构建配置提供. 如果您的项目是一个图书馆,那么当您尝试从另一个项目引用它时,您可能会遇到问题,因为您的图书馆只提供“blah”平台的实现,这不会在RID的兼容性树中其他项目正在反对.如果你的项目是一个应用程序,那么blah被忽略. 如果您重新配置项目以生成独立的软件包(通过删除或注释project.json中的“类型”:“平台”行),您将发现它不再生成,因为它现在具有依赖于运行时包,并且没有RID blah的包. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |