调用coreclr_initialize需传哪些参数?如何设置AppDomain.BaseDirectory?
coreclr_initialize 支持属性说明
必填属性
TRUSTED_PLATFORM_ASSEMBLIES:分号分隔的受信任托管程序集全路径列表,是运行时加载基础类库的必要参数APP_PATHS:分号分隔的应用程序根目录列表,该属性的值会直接作为AppDomain.CurrentDomain.BaseDirectory的返回值,你之前未配置该属性才会出现BaseDirectory为空的问题,coreclr_initialize传入的exePath参数仅标记入口程序路径,不会自动设置基目录
常用可选属性
NATIVE_DLL_SEARCH_DIRECTORIES:分号分隔的原生库搜索目录,.NET 5+的DllImport逻辑优先读取该配置的路径,不再完全依赖系统SetDllDirectory,将sni.dll所在的runtimes\win-x64\native路径加入该属性,即可自动加载无需手动调用LoadLibraryAPP_NI_PATHS:预编译本机映像程序集的搜索目录,用于优化启动性能TRUSTED_PLATFORM_ASSEMBLIES_RESOURCE_ROOTS:多语言场景下附属资源程序集的搜索路径System.Runtime.TieredCompilation:是否开启分层编译,取值为true/falseAPP_DOMAIN_FRIENDLY_NAME:自定义AppDomain的友好名称
配置示例
你只需要将需要设置的属性键值对传入coreclr_initialize的对应参数即可,参考修改:
private static class Native { [DllImport("coreclr.dll", CallingConvention=CallingConvention.Cdecl)] public static extern int coreclr_initialize( [MarshalAs(UnmanagedType.LPStr)] string exePath, [MarshalAs(UnmanagedType.LPStr)] string appDomainFriendlyName, int propertyCount, [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr)] string[] propertyKeys, [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr)] string[] propertyValues, out IntPtr hostHandle, out uint domainId); } // 调用时的属性配置示例 public void InitCoreClr() { string appBasePath = @"C:\你的应用根目录路径"; string nativeLibPath = Path.Combine(appBasePath, @"runtimes\win-x64\native"); // 替换为你实际的受信任程序集列表 string tpaList = "C:\\xxx\\System.Runtime.dll;C:\\xxx\\System.Data.SqlClient.dll;..."; string[] propertyKeys = new[] { "TRUSTED_PLATFORM_ASSEMBLIES", "APP_PATHS", "NATIVE_DLL_SEARCH_DIRECTORIES" }; string[] propertyValues = new[] { tpaList, appBasePath, // 此处配置的appBasePath就是最终的AppDomain.BaseDirectory $"{appBasePath};{nativeLibPath}" }; // 后续调用coreclr_initialize传入上述参数即可 }
补充说明:无需硬编码路径查找coreclr.dll的官方方案是通过hostfxr库提供的主机API来定位匹配版本的运行时路径,可避免硬编码版本号带来的兼容性问题。
内容的提问来源于stack exchange,提问作者Bryce Wagner
相关产品推荐
相关产品推荐

