运行时按需下载安装稀有功能依赖的Nuget库是否可行?
按需加载Nuget包方案实现指南
这个方案完全具备可行性,.NET运行时的默认机制确实是仅当代码执行到引用对应库的路径时才会尝试加载程序集,只要做好代码隔离就不会提前触发异常。
具体实现步骤
- 代码解耦隔离
把依赖该50MB Nuget包的业务代码单独抽到独立的类库项目中,主项目不要直接引用该Nuget包,也不要在主项目代码中直接声明该库的相关类型(包括字段、方法参数、直接实例化操作),避免启动时就触发程序集加载逻辑。
主项目仅声明该功能的抽象接口,比如ISpecialFeature,定义你需要用到的所有功能方法;独立类库引用主项目,实现这个接口即可。 - 按需下载依赖
提前将对应版本的Nuget包上传到你的自有文件存储服务,Nuget包本质是zip压缩包,你可以提前解压出目标框架对应的dll文件打包上传,也可以让客户端下载完自行解压。
用户触发该功能时,先校验本地私有存储目录下是否已存在对应的dll文件,不存在的话就后台启动下载,同时给用户展示加载提示即可。 - 运行时加载调用
下载完成后,调用Assembly.LoadFrom(dll文件本地路径)加载目标程序集,通过反射找到接口ISpecialFeature的实现类,实例化后转换为接口类型,之后就可以像调用普通本地方法一样使用该功能。
注意:如果该Nuget包本身还有二级依赖,你需要把所有依赖的dll都同步打包上传,加载主程序集前要先把所有依赖项都加载完成,否则仍会抛出程序集找不到的异常。
方案收益与成本评估
- 收益:如果该功能的用户占比低于30%,这个方案可以为绝大多数用户减少50MB的安装包体积,对用户下载转化率的提升效果非常明显。
- 成本:实现难度中等,核心需要处理好版本匹配、下载失败、文件损坏、权限校验这些异常场景,整体开发工作量大概在2~3人天。
- 特殊限制:如果你的应用需要上架应用商店,需要先确认对应商店的审核规则,部分商店禁止应用运行时动态下载可执行代码,这种情况下你只能选择直接打包该库。
内容的提问来源于stack exchange,提问作者Damn Vegetables
相关产品推荐
相关产品推荐

