.NET Core中Assembly.Load(string)方法是否具备幂等性?
关于重复调用Assembly.Load加载已存在程序集的问题说明
核心结论
默认场景下该操作是幂等的,不会重复创建程序集实例:CLR加载程序集时会先校验当前应用程序域中是否已加载相同标识的程序集,若匹配到已加载的同名称、同版本、同公钥Token的程序集,会直接返回现有实例,不会执行重复加载逻辑。
代码行为验证
你给出的两段代码逻辑:
- 首次通过
Assembly.GetAssembly(typeof(IEntityBase)).FullName获取程序集完整标识的逻辑是可靠的,拿到的FullName包含程序集的名称、版本、文化、公钥Token完整信息,匹配精度足够。 - 后续每次调用
Assembly.Load(_assemblyName)时,只要当前应用程序域未被重建、该程序集未被卸载,都会返回首次加载的同一个程序集实例,不会产生多副本。
潜在注意事项
虽然不会重复加载程序集,这段逻辑仍有可优化和需要注意的点:
- 每次调用
Assembly.Load、assembly.GetType都存在少量元数据查找开销,高并发请求场景下可以将解析得到的Type对象、甚至实例创建的工厂委托做本地缓存,进一步提升性能。 - 如果你的服务运行在多应用程序域隔离的场景下,不同应用程序域的程序集加载上下文相互隔离,跨域调用Load方法会在对应域单独创建程序集实例,属于CLR的正常隔离机制,不属于异常问题。
- 不要混用
Assembly.Load、Assembly.LoadFrom、Assembly.LoadFile三类加载方法加载同一程序集,不同加载上下文下可能出现同一程序集的多个副本,导致类型转换失败等异常,你的代码全程使用Load方法不存在该问题。
内容的提问来源于stack exchange,提问作者Bill Turner
相关产品推荐
相关产品推荐

