ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

.NET 运行时 hostfxr 与 hostpolicy:托管层 C 风格 API 全景解析

.NET 运行时 hostfxr 与 hostpolicy:托管层 C 风格 API 全景解析 .NET 运行时 hostfxr 与 hostpolicy托管层 C 风格 API 全景解析【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtime本文基于 .NET runtime 仓库的设计文档 hosting-layer-apis.md 系统梳理 .NET 托管层Hosting Layer对外暴露的全部 C 风格 APIhostfxr宿主框架解析器负责定位安装、解析 SDK/框架配置并管理宿主上下文生命周期hostpolicy宿主策略负责依赖解析并实际加载 CoreCLR。读完后你将能够在自研宿主程序中通过hostfxr_initialize_for_runtime_config、hostfxr_get_runtime_delegate、corehost_initialize等 API 完成“宿主中加载运行时、执行应用或获取函数指针”的完整集成并理解各参数的取值、错误码约定与线程模型。一、托管层的整体定位在 .NET 的安装布局中用户代码不会直接调用 CoreCLR而是经由两层原生库接入hostfxrlibhostfxr.so/hostfxr.dll第一层入口。它负责解析 .NET 安装根目录、global.json、SDK 与框架版本读取.runtimeconfig.json与.deps.json准备“加载运行时所需的一切”但本身不加载 CoreCLR。其源码位于 fxr 目录hostfxr.cpp 是所有导出函数的实现位置公开声明见 hostfxr.h。hostpolicylibhostpolicy.so/hostpolicy.dll第二层。它承接 hostfxr 传入的配置解析组件依赖并真正加载、初始化 CoreCLRcoreclr_initialize/coreclr_execute_assembly。源码位于 hostpolicy 目录hostpolicy.cpp公开声明见 hostpolicy.h。两层之间通过host_interface_t结构体传递初始化上下文其布局在 host_interface.h 中定义并附带了大量static_assert保证字段偏移的向后兼容该文件注释明确要求“只能追加字段、不得重排或修改字段类型”这是跨版本兼容性的核心手段。文档中引用的进阶主题另有专文原生托管场景见 native-hosting.md宿主中的组件依赖解析见 host-component-dependencies-resolution.md错误码总表见 host-error-codes.md。字符串编码约定char_t所有 API 中的char_t字符串按平台定义平台编码类型WindowsUTF-162 字节wchar_tVisual Studio 默认的 native type 定义UnixUTF-81 字节char这一约定在源码中与文档一致hostfxr.h 在 Windows 下将char_t定义为wchar_t未定义时退化为unsigned short否则定义为char。调用约定hostfxr 与 hostpolicy 两个库的所有导出函数及函数指针在 x86 平台上均使用__cdecl调用约定。源码中通过HOSTFXR_CALLTYPE/HOSTPOLICY_CALLTYPE宏实现平台适配仅在_WIN32下定义为__cdecl其他平台为空见 hostfxr.h 与 hostpolicy.h。二、Host FXR API.NET Core 1.0hostfxr_mainint hostfxr_main(const int argc, const char_t *argv[])运行一个应用程序。argc/argv— 命令行参数。该函数在应用执行完毕前不返回并在应用执行结束后关闭 CoreCLR。应用成功执行时返回应用的退出码否则返回表示失败的错误码。实现位于 hostfxr.cpp。此外从源码导出表可以看到为单文件 Bundle 场景还提供了hostfxr_main_bundle_startupinfo在hostfxr_main_startupinfo基础上多一个bundle_header_offset参数声明见 hostfxr.h实现见 hostfxr.cpp。.NET Core 2.0hostfxr_resolve_sdk已废弃int32_t hostfxr_resolve_sdk( const char_t *exe_dir, const char_t *working_dir, char_t buffer[], int32_t buffer_size)已废弃Obsolete应改用hostfxr_resolve_sdk2。源码中同样标注了[OBSOLETE] Replaced by hostfxr_resolve_sdk2hostfxr.cpp。.NET Core 2.1hostfxr_main_startupinfoint hostfxr_main_startupinfo( const int argc, const char_t *argv[], const char_t *host_path, const char_t *dotnet_root, const char_t *app_path)运行一个应用程序。相比hostfxr_main显式传入启动信息argc/argv— 命令行参数host_path— 宿主应用程序路径dotnet_root— .NET Core 安装根目录路径app_path— 要运行的应用路径。行为与hostfxr_main相同应用执行完毕前不返回执行后关闭 CoreCLR成功时返回应用退出码否则返回错误码。.NET Core 2.1hostfxr_resolve_sdk2enum hostfxr_resolve_sdk2_flags_t { disallow_prerelease 0x1, }; enum hostfxr_resolve_sdk2_result_key_t { resolved_sdk_dir 0, global_json_path 1, }; typedef void (*hostfxr_resolve_sdk2_result_fn)( hostfxr_resolve_sdk2_result_key_t key, const char_t* value); int32_t hostfxr_resolve_sdk2( const char_t *exe_dir, const char_t *working_dir, int32_t flags, hostfxr_resolve_sdk2_result_fn result)考虑global.json的影响确定 SDK 目录位置。exe_dir— 主目录SDK 位于其下sdk\[version]子目录中working_dir— 从该目录开始向上查找global.json的起点flags— 影响解析的标志位disallow_prerelease— 除非global.json明确指定了预发布版本否则解析结果不允许返回预发布 SDKresult— 回调函数用于返回解析值。回调可能被调用多次传入回调的字符串仅在调用期间有效。回调语义若解析成功result会以resolved_sdk_dir为 key 被调用值为解析出的 SDK 目录路径若解析失败result仍以resolved_sdk_dir为 key 被调用但值为nullptr。若使用了global.jsonresult会以global_json_path为 key 被调用值为该文件路径若未找到global.json或其内容未影响解析例如未指定版本则不会以该 key 调用回调。从源码实现看hostfxr.cpp除上述两个 key 外当前版本还会调用requested_version与global_json_state两个额外的结果 key 向消费者传递请求版本与 global.json 的处理状态——这是文档未列出的演进细节集成方若需跨版本兼容建议对未知 key 保持忽略。.NET Core 2.1hostfxr_get_available_sdkstypedef void (*hostfxr_get_available_sdks_result_fn)( int32_t sdk_count, const char_t *sdk_dirs[]); int32_t hostfxr_get_available_sdks( const char_t *exe_dir, hostfxr_get_available_sdks_result_fn result)获取所有可用 SDK 的列表按版本升序排列。exe_dir— dotnet 可执行文件的路径result— 以目录路径数组返回 SDK 列表的回调。字符串数组及其元素仅在调用期间有效。.NET Core 2.1hostfxr_get_native_search_directoriesint32_t hostfxr_get_native_search_directories( const int argc, const char_t *argv[], char_t buffer[], int32_t buffer_size, int32_t *required_buffer_size)基于指定应用获取运行时的原生native搜索目录。argc/argv— 命令行参数buffer— 用于填入原生搜索目录的缓冲区含 null 终止符buffer_size—buffer的大小单位为char_trequired_buffer_size— 若buffer太小此出参写入所需的最小缓冲区大小含 null 终止符否则置 0。返回的目录列表以PATH_SEPARATOR分隔Windows 上为分号;其他平台为冒号:。若buffer_size小于所需最小值函数返回HostApiBufferTooSmall且buffer保持不变。对应测试见 get_native_search_directories_test.cpp。.NET Core 3.0hostfxr_set_error_writertypedef void(*hostfxr_error_writer_fn)(const char_t *message); hostfxr_error_writer_fn hostfxr_set_error_writer(hostfxr_error_writer_fn error_writer)设置用于报告错误消息的回调。默认未注册回调错误写入标准错误流。error_writer— 每次报告错误时调用的回调函数。置为nullptr时取消已注册的回调并恢复默认行为。返回值是先前注册的回调此时它已被注销若此前没有注册则返回nullptr。关键线程模型与传播规则与 hostfxr.h 中的注释一致错误写入器按线程注册thread-local每个线程只能注册一个回调后续注册会覆盖前一个每次对错误写入器的调用相当于写一行不含行结束符一次失败可能触发多次调用若hostfxr在运行过程中调用了hostpolicy的函数错误写入器会在调用期间传播给hostpolicy——即两层产生的错误都会经由同一个错误写入器上报。.NET Core 3.0宿主上下文生命周期 API这是自托管self-hosting场景的核心。完整语义与参数说明另见 native-hosting.md以下为文档给出的 API 契约并对照 hostfxr.h 中的实现细节补充。初始化参数结构体typedef void* hostfxr_handle; struct hostfxr_initialize_parameters { size_t size; const char_t *host_path; const char_t *dotnet_root; };hostfxr_initialize_for_dotnet_command_lineint hostfxr_initialize_for_dotnet_command_line( int argc, const char_t *argv[], const hostfxr_initialize_parameters *parameters, hostfxr_handle * host_context_handle);为运行托管应用初始化托管组件。argc/argv— 命令行参数形如通过 dotnet 可执行文件传入的app.dll arg1 arg2parameters— 可选的附加参数host_context_handle— 初始化成功时接收一个标识已初始化宿主上下文的句柄值。从 hostfxr.h 的声明注释可补充三点实现约束该函数只解析命令行以确定要运行的应用、找到对应的.runtimeconfig.json与.deps.json并准备加载运行时的全部信息但不会加载运行时它只支持“运行应用”的参数不支持 SDK/CLI 命令若托管组件已初始化则返回HostInvalidState。hostfxr_initialize_for_runtime_configint hostfxr_initialize_for_runtime_config( const char_t *runtime_config_path, const hostfxr_initialize_parameters *parameters, hostfxr_handle *host_context_handle);基于运行时配置文件.runtimeconfig.json初始化托管组件。runtime_config_path— 要处理的.runtimeconfig.json文件路径parameters— 可选附加参数host_context_handle— 初始化成功时接收宿主上下文句柄。根据 hostfxr.h 的注释返回值除Success外还可能为Success_HostAlreadyInitialized与已初始化的托管组件兼容、Success_DifferentRuntimeProperties运行时属性存在差异需消费者自行判断可接受性以及HostIncompatibleConfig不兼容。前两种成功码均视为初始化成功。该入口只处理框架的.deps.json不处理与.runtimeconfig.json相邻的应用/组件级.deps.json。运行时属性runtime propertiesint hostfxr_get_runtime_property_value( const hostfxr_handle host_context_handle, const char_t *name, const char_t **value);按名称获取运行时属性值。host_context_handle— 已初始化的宿主上下文。置为nullptr时函数作用于进程中的第一个宿主上下文name— 要获取的运行时属性名value— 输出参数指向属性值缓冲区的指针。从源码注释看hostfxr.hvalue指向的缓冲区由宿主上下文所有其生命周期保证到以下任一事件发生为止对该上下文调用 run 方法、通过hostfxr_set_runtime_property_value修改属性、或调用hostfxr_close关闭上下文。int hostfxr_set_runtime_property_value( const hostfxr_handle host_context_handle, const char_t *name, const char_t *value);设置属性值。host_context_handle— 已初始化的宿主上下文name— 要设置的运行时属性名value— 要设置的值。若属性在宿主上下文中已有值本函数会覆盖它置为nullptr且属性已有值时属性被移除。从 hostfxr.h 的约束看设置属性仅支持在第一个宿主上下文、且运行时加载之前进行。int hostfxr_get_runtime_properties( const hostfxr_handle host_context_handle, size_t * count, const char_t **keys, const char_t **values);获取指定宿主上下文的全部运行时属性。host_context_handle— 已初始化的宿主上下文。置为nullptr时作用于进程中的第一个宿主上下文count— in/out 参数不可为nullptr。输入时表示keys与values缓冲区的大小输出时表示实际使用的条目数即返回的属性个数keys— 充当“指向各属性 key 缓冲区指针”的数组的缓冲区values— 充当“指向各属性值缓冲区指针”的数组的缓冲区。若count小于所需最小缓冲区大小或keys/values为nullptr函数返回HostApiBufferTooSmallkeys与values保持不变此时count会被写入可用属性数量便于二次分配。hostfxr_run_appint hostfxr_run_app(const hostfxr_handle host_context_handle);运行由hostfxr_initialize_for_dotnet_command_line指定的应用。host_context_handle— 已初始化宿主上下文的句柄。应用执行完毕前不返回执行后关闭 CoreCLR。成功执行时返回应用退出码否则返回错误码。源码注释明确要求句柄必须来自hostfxr_initialize_for_dotnet_command_linehostfxr.h。hostfxr_get_runtime_delegateint hostfxr_get_runtime_delegate(const hostfxr_handle host_context_handle, hostfxr_delegate_type type, void ** delegate);启动运行时并获取指定运行时功能的函数指针。host_context_handle— 已初始化的宿主上下文type— 请求的运行时功能类型delegate— 成功时写入所请求运行时功能的原生函数指针。委托类型枚举hostfxr_delegate_type定义在 hostfxr.h包含hdt_com_activation、hdt_load_in_memory_assembly、hdt_winrt_activation、hdt_com_register、hdt_com_unregister、hdt_load_assembly_and_get_function_pointer、hdt_get_function_pointer、hdt_load_assembly、hdt_load_assembly_bytes。从源码注释看hostfxr.h存在按初始化入口划分的支持矩阵由hostfxr_initialize_for_runtime_config初始化的上下文支持所有委托类型由hostfxr_initialize_for_dotnet_command_line初始化的上下文文档编写时点仅支持hdt_load_assembly_and_get_function_pointer与hdt_get_function_pointer。hostfxr_closeint hostfxr_close(const hostfxr_handle host_context_handle);关闭宿主上下文。host_context_handle— 要关闭的已初始化宿主上下文。至此完成“initialize → 设置属性 → run_app / get_runtime_delegate → close”的完整宿主上下文生命周期。源码中可见的后续演进 API文档之外hostfxr.h 与 hostfxr.cpp 还导出了若干后续版本新增的 API供需要在现代宿主中查询环境或预解析框架的场景参考hostfxr_get_dotnet_environment_info给定 dotnet 根目录或全局默认位置按版本升序返回可用 SDK 与按名称/版本升序返回的框架列表结果结构为hostfxr_dotnet_environment_info含hostfxr_version、hostfxr_commit_hash、SDK 数组、框架数组hostfxr_resolve_frameworks_for_runtime_config针对指定.runtimeconfig.json解析框架通过回调返回resolved_frameworks与unresolved_frameworks两组结果含请求版本与解析版本。从源码结构看这些 API 沿用了相同的char_t编码约定与“字符串仅在回调期间有效”的生命周期规则。三、Host Policy API.NET Core 1.0corehost_load / corehost_main / corehost_unloadint corehost_load(host_interface_t *init)初始化hostpolicy。它保存执行“启动 CoreCLR 所需全部处理”的信息但不实际执行任何处理。init— 定义库应如何初始化的结构体见下文“host_interface_t 结构体”。若库已初始化本函数直接返回成功且不重新初始化init被忽略。int corehost_main(const int argc, const char_t* argv[])运行一个应用程序。argc/argv— 命令行参数。应用执行完毕前不返回执行后关闭 CoreCLR。成功时返回应用退出码否则返回错误码。int corehost_unload()反初始化hostpolicy。.NET Core 2.1corehost_main_with_output_bufferint corehost_main_with_output_buffer( const int argc, const char_t *argv[], char_t buffer[], int32_t buffer_size, int32_t *required_buffer_size)运行宿主命令并返回其输出。要求此前已以init-host_command被设置的状态调用过corehost_load(init)。该函数运行于托管层并不实际运行 CoreCLR。argc/argv— 命令行参数buffer— 用于填入输出的缓冲区含 null 终止符buffer_size—buffer的大小单位为char_trequired_buffer_size— 若buffer太小写入所需最小缓冲区大小含 null 终止符否则置 0。若buffer_size小于所需最小值返回HostApiBufferTooSmall且buffer保持不变。.NET Core 3.0corehost_resolve_component_dependenciestypedef void(*corehost_resolve_component_dependencies_result_fn)( const char_t *assembly_paths, const char_t *native_search_paths, const char_t *resource_search_paths); int corehost_resolve_component_dependencies( const char_t *component_main_assembly_path, corehost_resolve_component_dependencies_result_fn result)解析指定组件的依赖。component_main_assembly_path— 组件的路径主程序集result— 接收组件依赖解析结果的回调分别收到程序集路径、原生搜索路径与资源搜索路径三个以PATH_SEPARATOR分隔的路径串。完整机制含.deps.json中组件条目的格式见 host-component-dependencies-resolution.md对应测试见 resolve_component_dependencies_test.cpp。.NET Core 3.0corehost_set_error_writertypedef void(*corehost_error_writer_fn)(const char_t *message); corehost_error_writer_fn corehost_set_error_writer(corehost_error_writer_fn error_writer)设置用于报告错误消息的回调。默认未注册回调错误写入标准错误流。error_writer— 每次报告错误时调用的回调。置为nullptr时取消已注册回调并恢复默认行为。返回值是先前注册的回调此时已注销或nullptr。错误写入器按线程注册每个线程只能注册一个回调后续注册覆盖前一个。与 hostfxr 侧不同文档未描述 hostpolicy 独立注册时的传播语义——传播由 hostfxr 在调用期间完成见上文 hostfxr 一节。错误写入器的重定向实现在 redirected_error_writer.cpp测试工具 error_writer_redirector.cpp 验证了该机制。.NET Core 3.0corehost_context_contract 与 corehost_initializetypedef void* context_handle; struct corehost_context_contract { size_t version; int (*get_property_value)( const char_t *key, const char_t **value); int (*set_property_value)( const char_t *key, const char_t *value); int (*get_properties)( size_t *count, const char_t **keys, const char_t **values); int (*load_runtime)(); int (*run_app)( const int argc, const char_t* argv[]); int (*get_runtime_delegate)( coreclr_delegate_type type, void** delegate); };在已初始化的 hostpolicy 上执行操作的契约version— 结构体版本get_property_value— 获取宿主上下文属性的函数指针key— 要获取的属性的 keyvalue— 指向所取得属性值缓冲区的指针set_property_value— 设置宿主上下文属性的函数指针key— 要设置的属性的 keyvalue— 要设置的值为nullptr时属性被移除get_properties— 获取宿主上下文全部属性的函数指针count—keys与values的大小。若太小将被写入所需大小否则写入实际使用的大小keys— 填入属性 key 的缓冲区values— 填入属性值的缓冲区load_runtime— 加载 CoreCLR 的函数指针run_app— 运行应用的函数指针argc/argv— 命令行参数get_runtime_delegate— 获取 CoreCLR 功能委托的函数指针type— 请求的运行时功能类型delegate— 所请求运行时功能的函数指针。从源码结构看当前实现的 corehost_context_contract 在文档所示字段之后还追加了last_known_delegate_type5.0 起并同样用static_assert固定每个字段的偏移——这是“只追加、不重排”兼容策略的具体体现。coreclr_delegate_type枚举定义在同文件corehost_context_contract.h其取值与 hostfxr 侧的hostfxr_delegate_type一一对应com_activation、load_in_memory_assembly、winrt_activation、com_register、com_unregister、load_assembly_and_get_function_pointer、get_function_pointer、load_assembly、load_assembly_bytes。enum initialization_options_t { none 0x0, wait_for_initialized 0x1, get_contract 0x2, }; int corehost_initialize(const corehost_initialize_request_t *init_request, int32_t options, corehost_context_contract *context_contract)初始化 hostpolicy。它计算“启动或附加到 CoreCLR 所需的一切”但不实际执行。init_request— 包含初始化请求信息的结构体。若 hostpolicy 尚未初始化此处期望为nullptr若已初始化则不可为nullptr本函数将用该结构体检查与先前初始化方式的兼容性options— 初始化选项wait_for_initialized— 等待通过另一请求完成的初始化结束get_contract— 获取已初始化 hostpolicy 的契约context_contract— 初始化成功时填入操作已初始化 hostpolicy 的契约。init_request的结构体corehost_initialize_request_t在 corehost_context_contract.h 中定义为versionconfig_keysconfig_valuesstrarr_t字符串数组对同样带有偏移兼容断言。源码中该枚举还包含context_contract_version_set 0x80000000位corehost_context_contract.h用于在输入时声明version字段已写入、指示可填充缓冲区的大小上限。host_interface_t跨层传递的初始化上下文corehost_load的init参数即 host_interface.h 中的host_interface_t。其关键字段包括version_lo/version_hi版本信息version_lo直接赋sizeof()布局破坏性变更时递增HOST_INTERFACE_LAYOUT_VERSION_HIconfig_keys/config_values运行时配置键值对strarr_t字符串数组fx_dir/fx_name/fx_ver解析出的框架目录、名称与版本deps_file依赖文件路径probe_paths探测路径集合patch_roll_forward/prerelease_roll_forward补丁/预发布滚动升级策略host_mode宿主模式muxer即作为dotnet.exe调用、apphost即重命名后的应用宿主、libhost即 COM 激活或自托管等非 exe 场景host_commandcorehost_main_with_output_buffer所需的宿主命令host_info_host_path/host_info_dotnet_root/host_info_app_path宿主路径、.NET 根目录与应用路径single_file_bundle_header_offset单文件 Bundle 头偏移。该结构体被显式 1 字节打包#pragma pack(push, 1)注释与static_assert链host_interface.h共同约束任何修改者只追加字段、不改顺序与类型、为新增字段补断言。四、错误码与缓冲区约定文档中反复出现的HostApiBufferTooSmall属于统一的宿主错误码体系完整定义见 error_codes.h人读版文档为 host-error-codes.md。与本文 API 直接相关的条目包括错误码十六进制值含义Success0操作成功Success_HostAlreadyInitialized0x00000001初始化成功但另一宿主上下文已初始化Success_DifferentRuntimeProperties0x00000002初始化成功但已初始化上下文的运行时属性与请求不同InvalidArgFailure0x80008081一个或多个参数无效InvalidConfigFile0x80008093.runtimeconfig.json文件无效HostApiBufferTooSmall0x80008098提供给宿主 API 的缓冲区太小SdkResolveFailure0x8000809b未能找到所请求的 SDKHostInvalidState0x800080a3当前状态与请求的操作不兼容HostPropertyNotFound0x800080a4hostfxr_get_runtime_property_value请求的属性不存在HostIncompatibleConfig0x800080a5宿主配置与现有宿主上下文不兼容注意error_codes.h中的判定宏STATUS_CODE_SUCCEEDED(status_code)定义为((int)(status_code)) 0——即错误码以 0x800080xx 高位区分失败调用方只需检查非负即可判定成功。所有带输出缓冲区的 APIhostfxr_get_native_search_directories、corehost_main_with_output_buffer等统一遵循“缓冲区太小 → 返回HostApiBufferTooSmall、缓冲区不变、由required_buffer_size报告所需大小”的二次分配模式集成方可以先传buffer_size 0探测所需长度。五、版本能力速查与源码对照API引入版本按文档所属库源码位置hostfxr_main.NET Core 1.0hostfxrhostfxr.cpphostfxr_resolve_sdk废弃.NET Core 2.0hostfxrhostfxr.cpphostfxr_main_startupinfo.NET Core 2.1hostfxrhostfxr.cpphostfxr_resolve_sdk2.NET Core 2.1hostfxrhostfxr.cpphostfxr_get_available_sdks.NET Core 2.1hostfxrhostfxr.cpphostfxr_get_native_search_directories.NET Core 2.1hostfxrhostfxr.cpphostfxr_set_error_writer.NET Core 3.0hostfxrhostfxr.cpphostfxr_initialize_for_dotnet_command_line.NET Core 3.0hostfxrhostfxr.cpphostfxr_initialize_for_runtime_config.NET Core 3.0hostfxrhostfxr.cpphostfxr_run_app.NET Core 3.0hostfxrhostfxr.cpphostfxr_get_runtime_delegate.NET Core 3.0hostfxrhostfxr.cpphostfxr_get/set/get_runtime_properties.NET Core 3.0hostfxrhostfxr.cpphostfxr_close.NET Core 3.0hostfxrhostfxr.cppcorehost_load/corehost_main/corehost_unload.NET Core 1.0hostpolicyhostpolicy.cppcorehost_main_with_output_buffer.NET Core 2.1hostpolicyhostpolicy.cppcorehost_resolve_component_dependencies.NET Core 3.0hostpolicyhostpolicy.hcorehost_set_error_writer.NET Core 3.0hostpolicyhostpolicy.hcorehost_context_contract/corehost_initialize.NET Core 3.0hostpolicycorehost_context_contract.h六、集成要点小结入口选择只需“跑应用”用hostfxr_main/hostfxr_run_app需要“在宿主中嵌入运行时、取函数指针”用hostfxr_initialize_for_runtime_confighostfxr_get_runtime_delegate此入口支持全部委托类型需要“宿主命令输出”用corehost_main_with_output_buffer需先以host_command调corehost_load。缓冲区模式所有带buffer/buffer_size/required_buffer_size的 API 均遵循“太小即HostApiBufferTooSmall且缓冲区不变”的约定支持先探测后分配。字符串生命周期回调返回的字符串SDK 目录、属性值等均仅保证在回调/调用期间有效需要留存请自行拷贝host context 持有的属性缓冲区生命周期以 run、属性变更或hostfxr_close为界。错误上报生产宿主应注册 error writer 接管 stderr 输出注意其线程局部特性以及 hostfxr → hostpolicy 调用期间的传播行为。兼容策略hostfxr 各初始化 API 要求“同一进程内保持配置兼容”Success_HostAlreadyInitialized/HostIncompatibleConfig语义跨版本结构体兼容依赖host_interface_t、corehost_context_contract的“只追加 偏移断言”约束。上述行为均可在仓库中直接验证API 契约见 hostfxr.h 与 hostpolicy.h实现见 fxr/hostfxr.cpp 与 hostpolicy/hostpolicy.cpp测试入口在 nativehost 测试目录含 mock 宿主、错误写入器重定向与依赖解析测试。【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进