使用hostfxr托管CoreCLR时如何设置AppContext.BaseDirectory
解决原生托管CoreCLR时AppContext.BaseDirectory为空的问题
核心修复:配置
assembly_path参数
仅设置hostfxr_initialize_parameters.host_path不足以让CoreCLR正确识别托管代码的基目录,你需要同时将结构体中的assembly_path字段设置为托管程序集(.dll文件)的完整绝对路径。CoreCLR会以此路径为基础推导AppContext.BaseDirectory。补充:正确传递应用参数
初始化hostfxr时,需填充app_argc和app_argv,将原生EXE的完整路径作为第一个参数传入。示例代码片段:const wchar_t* argv[] = { L"C:\\path\\to\\your\\native.exe", nullptr }; hostfxr_initialize_parameters init_params{}; init_params.size = sizeof(hostfxr_initialize_parameters); init_params.host_path = L"C:\\path\\to\\hostfxr.dll"; // 或原生EXE路径 init_params.assembly_path = L"C:\\path\\to\\your\\managed.dll"; init_params.app_argc = _countof(argv) - 1; init_params.app_argv = argv;备选方案:托管代码手动指定
若上述配置仍未生效,可在托管代码启动时手动设置基目录:AppDomain.CurrentDomain.SetData("APPBASE", @"C:\path\to\your\managed\assembly\directory");但优先推荐通过hostfxr参数配置,这更符合.NET运行时的设计逻辑。
注意事项
所有传入的路径必须是绝对路径,相对路径可能导致运行时无法正确解析目录,可通过原生API(如Windows的GetFullPathNameW)将相对路径转换为绝对路径后再传入。
内容的提问来源于stack exchange,提问作者Sardelka
相关产品推荐
相关产品推荐

