编辑 - 简短回答
如果您选择 portable
,每次启动应用程序时,它都需要对实际执行的应用程序部分进行JIT编译。如果您的应用程序很大,性能可能会受到影响。
如果您选择 x64
,应用程序不会因为编译而变慢,因为这已经由发布过程在构建机器(您的笔记本电脑)上完成。
原始回答
当您选择Portable
发布选项时,您将获得一个可以在x86(32位)机器和x64(64位)机器上运行的包。选择便携式选项后,在应用程序启动时,您将获得针对目标机器(x64或x86)的JIT编译代码,因为应用程序正在运行。但是,如果应用程序关闭,则所有已经JIT编译的代码都将丢失。编译代码存储在内存中,直到应用程序进程结束。下一次运行将再次使用JIT编译应用程序。这里的优点是您只需要分发一个软件包,它将在x86 / x64机器上运行。
另外一种选择是生成多个打包文件,每个针对不同的目标平台。在这种情况下,你将获得专门为各个机器编译好的打包文件,并且甚至在应用程序进程结束并重新启动后也不需要重新编译。这样做会使你的应用程序看起来运行更快,因为编译只会在构建服务器/机器上进行一次。然而,它确实会影响你的部署方式。
关于.NET运行时标识符的更多信息可以在此处找到:https://learn.microsoft.com/en-us/dotnet/core/rid-catalog
有关JIT编译代码的良好文档,请参阅此处:https://www.telerik.com/blogs/understanding-net-just-in-time-compilation
被接受的答案关于JIT假设有点错误(无论如何,JIT编译都会在目标机器上发生)。来自@Greg-Gum的其他答案解释了R2R要求,但仍未解释底层发生了什么。
当您将“目标运行时”设置为“可移植”时,发布过程会在发布目标中包含运行时DLL
发布目标中将有一个/runtime
子文件夹,其中包括多个平台及其组合的本地/运行时文件和依赖项。此文件夹可能有几兆字节。
例如:假设您的项目使用SqlClient
nuget。在Windows上(但不在Linux上),此nuget依赖于sni.dll
本地库。因此,该文件将放置在/runtimes/win-x64/native/sni.dll
和/runtimes/win-x86/native/sni.dll
(相应版本)中。
这只是一个例子,还有许多其他事情正在进行。
win-x64
,JIT编译仍应该是执行的一部分。.NET Native目前还不适用于.NET Core,因此没有AOT来取代JIT。 - Lex Li