外部DLL中Assembly.GetExecutingAssembly().Location返回空字符串问题
问题原因分析
1. 引擎DLL的加载模式导致自身Assembly属性无有效路径
你的引擎DLL大概率是通过内存加载、影子复制(Shadow Copy)或者嵌入资源动态加载的方式被主应用加载的:
- 当DLL从内存直接加载而非磁盘文件时,
Assembly.GetExecutingAssembly().Location会返回空字符串——这个属性仅在Assembly从磁盘文件加载时,才会指向对应的文件路径。 - 若启用了.NET的影子复制机制(常见于插件框架、部分服务场景),DLL会被复制到临时目录后加载,特殊加载逻辑下也可能导致
Location返回空。
2. 主应用与引擎DLL的Assembly上下文差异
主应用调用这些方法能正常获取路径,是因为主应用程序集从磁盘正常加载,Assembly.Location、AppContext.BaseDirectory等属性会正确指向应用目录。但在引擎DLL内部调用时,是基于DLL自身的Assembly上下文:
Assembly.GetEntryAssembly().Location理论上应返回主应用路径,但如果引擎DLL被加载到独立AppDomain,或加载时机早于主应用完全初始化,这个方法可能返回null,进而导致路径为空。Directory.GetCurrentDirectory()、AppDomain.CurrentDomain.BaseDirectory的值依赖当前工作目录或AppDomain基目录,若引擎DLL加载时工作目录被修改、AppDomain配置特殊,也会返回空或错误路径。
3. Assembly.GetCallingAssembly()有效的核心原因
Assembly.GetCallingAssembly()返回的是调用当前方法的代码所在程序集——也就是你的主应用程序集。主应用从磁盘正常加载,其Location属性能正确指向应用目录,因此用这个方法可以拿到有效路径。
内容的提问来源于stack exchange,提问作者Wolf
相关产品推荐
相关产品推荐

