dotnet/runtime 如何用 corerun 与 Core_Root 运行自己构建的托管应用?
【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtime
你在 dotnet/runtime 仓库里改动了 CoreCLR 或托管类库,想用自己构建出来的运行时(而不是机器上安装的 .NET)来运行一个托管控制台应用,验证改动是否生效。using-corerun-and-coreroot.md 给出了两条路径:
- 直接使用
clr子集构建产物里的corerun宿主,再通过CORE_LIBRARIES指定类库来源; - 通过测试构建脚本生成 Core_Root——一个把你构建的运行时和所需类库打包在一起的目录——再用其中的
corerun运行应用。
前提条件:已经至少构建过仓库的clr子集,二进制产物位于artifacts/bin/coreclr/<OS>.<arch>.<configuration>。如果没有构建过,先看 CoreCLR 构建文档。
先了解 corerun 如何定位运行时和类库
corerun是一个平台无关的快速测试工具,定位 .NET 运行时二进制(Windows 的coreclr.dll、macOS 的libcoreclr.dylib、Linux 的libcoreclr.so)时按以下顺序使用启发式规则:
- 检查用户是否传了
--clr-path参数; - 检查是否定义了
CORE_ROOT环境变量; - 检查运行时二进制是否与
corerun位于同一目录。
无论用哪种方式找到运行时,它的目录同时用于查找基类程序集(System.Runtime.dll、System.IO.dll等)。额外的类库目录可以通过定义CORE_LIBRARIES环境变量加入。注意corerun完全不感知 NuGet,它只负责找到运行时和类库程序集。
corerun在构建clr子集时生成,位于<repo root>/artifacts/bin/coreclr/<OS>.<Arch>.<Configuration>目录(Windows 上为corerun.exe)。
路径一:用 clr 构建产物中的 corerun 运行应用
准备一个测试应用
先创建一个简单的 Hello World 控制台应用作为运行对象:
mkdir HelloWorld && cd HelloWorld dotnet new console dotnet build设置 corerun 的查找路径
下一步是让corerun能找到运行时和类库。文档示例假设你以Debug配置、x64架构构建,且机器上安装的 .NET 运行时版本是7.0.0——请根据自己的构建配置和实际安装版本替换路径:
<repo_root>:你的 runtime 仓库检出根目录;7.0.0:你机器上Microsoft.NETCore.App共享框架的版本目录。
把corerun所在目录加入PATH(可省略,省略时每次用完整路径调用即可),并把CORE_LIBRARIES指向系统安装的 .NET 共享框架目录。因为只构建了运行时,类库用机器上已有的:
Windows 命令行:
set PATH=%PATH%;<repo_root>\artifacts\bin\coreclr\windows.x64.Debug set CORE_LIBRARIES=%ProgramFiles%\dotnet\shared\Microsoft.NETCore.App\7.0.0 corerun HelloWorld.dllmacOS 和 Linux(文档示例为 osx,Linux 上把路径换成linux):
# Change osx to linux if you're on a Linux machine. export PATH="$PATH:<repo_root>/artifacts/bin/coreclr/osx.x64.Debug" export CORE_LIBRARIES="/usr/local/share/dotnet/shared/Microsoft.NETCore.App/7.0.0" corerun HelloWorld.dllPowerShell(用+=追加到已有PATH;Linux/macOS 上分隔符改用:):
$Env:PATH += ';<repo_root>\artifacts\windows.x64.Debug' $Env:CORE_LIBRARIES = %ProgramFiles%\dotnet\shared\Microsoft.NETCore.App\7.0.0 corerun HelloWorld.dll上面的 PowerShell 片段按源文档原样保留。
运行与验证
执行corerun HelloWorld.dll后,控制台应用应使用你构建的运行时正常运行并打印输出、退出。环境变量只需设置一次,同一个终端实例内一直有效;之后你重新构建运行时(加入更多改动)再重新构建应用时,直接重跑corerun即可验证新改动。
如果 corerun 报找不到运行时或程序集,按上面的启发式顺序检查:--clr-path是否指向有效路径、CORE_ROOT是否已定义、运行时二进制是否与 corerun 同目录,以及CORE_LIBRARIES指向的目录里是否确实有应用依赖的 dll。
可选:用 self-contained 发布目录替代系统类库
如果应用以 self-contained 方式发布(dotnet publish --self-contained),发布目录里已经部署了全部所需类库。这时只需把上一节的CORE_LIBRARIES改为指向该发布目录,corerun就会从你的发布应用中加载这些程序集,而不依赖系统安装的 .NET。
路径二:生成 Core_Root 后运行应用
Core_Root 是测试构建脚本(src/tests/build.cmd或 src/tests/build.sh)整理出来的目录:把刚构建的 CoreCLR 和测试所需的类库组件收集在一起,输出到artifacts/tests/coreclr/<OS>.<Arch>.<Configuration>/Tests/Core_Root。与路径一相比,它的优势是可以同时测试和调试类库改动。
前置构建
生成 Core_Root 前必须先构建过类库(-subset libs)。推荐的工作流是 clr 用Debug、类库用Release(见 CoreCLR 构建文档):
./build.sh -subset clr+libs -runtimeConfiguration Debug -librariesConfiguration Release两个注意点(来自 testing.md):
- 测试构建脚本默认在Release模式下查找类库,无论你指定的运行时配置是什么。如果你用其他配置构建了类库,必须传
/p:LibrariesConfiguration=<your_config>(<your_config>换成你的实际配置,如Debug)。 - 完整测试套件构建耗时很长,因此建议只用
-generatelayoutonly参数生成 Core_Root,需要时再单独构建具体测试。
生成 Core_Root
在仓库根目录执行(Windows 示例来自 testing.md,假设 CoreCLR 为Debug、类库为Release,因此无需额外参数):
.\src\tests\build.cmd generatelayoutonlymacOS/Linux 上对应src/tests/build.sh,CoreCLR 构建文档给出的带配置参数的示例为:
./src/tests/build.sh -arch x64 -checked -generatelayoutonly构建完成后,Core_Root 位于artifacts/tests/coreclr/<OS>.<arch>.<configuration>/Tests/Core_Root。
运行应用
Core_Root 里已经包含了corerun和全部类库,所以不需要再设置CORE_LIBRARIES,把 Core_Root 加入PATH直接运行即可:
Windows 命令行:
set PATH=%PATH%;<repo_root>\artifacts\tests\coreclr\windows.x64.Debug\Tests\Core_Root corerun HelloWorld.dllmacOS 和 Linux:
# Change linux to osx if you're on a macOS machine. export PATH="$PATH:<repo_root>/artifacts/tests/coreclr/linux.x64.Debug/Tests/Core_Root" corerun HelloWorld.dllPowerShell:
$Env:PATH += ';<repo_root>\artifacts\tests\coreclr\windows.x64.Debug\Tests\Core_Root' corerun HelloWorld.dll验证方式同路径一:应用应使用 Core_Root 中你构建的运行时与类库正常执行并输出结果。
corerun 的附加选项
corerun --help会列出以下可选命令行参数:
--clr-path <PATH>:在命令行上传入 Core_Root 的位置。若 corerun 本身就在 Core_Root 文件夹内,或已通过CORE_ROOT环境变量设置了路径,可省略该参数。示例:corerun --clr-path /path/to/core_root HelloWorld.dll--property <PROPERTY>:在初始化时向 .NET 运行时传入一个属性。示例:corerun --property System.GC.Concurrent=true HelloWorld.dll--debug:在加载 .NET 运行时之前等待调试器附加。示例:corerun --debug HelloWorld.dll--env:传入一个.env文件路径,为测试运行指定环境变量。示例:corerun --env gcstress.env HelloWorld.dll
限制与替代路径
corerun不处理 NuGet 恢复,只负责发现运行时二进制和类库程序集;类库来源由CORE_LIBRARIES或 Core_Root 决定。- 本文只覆盖 corerun 与 Core_Root 这条路径。文档还提到另外两种用自建运行时跑应用的方式:使用 Dev Shipping Packages(见 using-dev-shipping-packages.md),或配合机器上已安装的 SDK 替换自包含应用中的相应二进制。
- 生成 Core_Root 的测试构建脚本默认按Release查找类库,配置不一致时应用无法定位到正确的类库,需按上文传
/p:LibrariesConfiguration=<your_config>。
【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtime
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考