安装时如何获取指定程序集对应的用户级隔离存储路径
实现方法
要在安装阶段不加载目标程序集的前提下,拿到和运行时IsolatedStorageFile.GetUserStoreForAssembly()完全一致的隔离存储,核心是给GetStore方法传入目标程序集的程序集标识,而不是加载后的程序集实例。
你卡住的assembly param位置,需要传入目标程序集对应的AssemblyName对象,不需要真的加载程序集运行。
具体实现步骤
- 调用
AssemblyName.GetAssemblyName()方法,传入你已知的目标程序集完整文件路径,这个方法只会读取程序集头部的元数据生成标识对象,不会把程序集加载到当前进程执行,也不会触发依赖解析。 - 调用
IsolatedStorageFile.GetStore时,作用域参数保持IsolatedStorageScope.User | IsolatedStorageScope.Assembly,应用程序证据参数传null,assembly参数传入上一步拿到的AssemblyName实例即可。
代码示例
// 替换为你已知的目标程序集完整文件路径 string targetAssemblyFullPath = @"C:\Program Files\你的应用\目标程序集.dll"; // 仅读取元数据获取程序集标识,无程序集加载副作用 AssemblyName targetAssemblyIdentity = AssemblyName.GetAssemblyName(targetAssemblyFullPath); // 获取的隔离存储和目标程序集运行时调用GetUserStoreForAssembly()结果完全一致 using (IsolatedStorageFile isoStorage = IsolatedStorageFile.GetStore( scope: IsolatedStorageScope.User | IsolatedStorageScope.Assembly, domainIdentity: null, assemblyIdentity: targetAssemblyIdentity)) { // 在此处写入初始配置即可,操作的存储路径和运行时完全匹配 }
原理说明
GetUserStoreForAssembly()内部的实现逻辑,本质就是自动获取当前执行程序集的AssemblyName作为程序集标识,传入GetStore生成对应的隔离存储路径。隔离存储的路径哈希计算只依赖程序集的名称、版本、公钥令牌(强名称程序集)等元数据标识,和程序集是否被加载运行无关,所以直接传入提前读取到的AssemblyName就能拿到完全一致的存储位置。
注意事项
- 不要使用
Assembly.LoadFrom/Assembly.LoadFile加载目标程序集后再传参,这类方法会把程序集加载到安装进程的上下文,可能引发文件锁、依赖缺失报错等问题,完全没有必要。 - 如果目标程序集后续版本会变更版本号、强名称公钥,安装阶段写入的隔离存储会对应到对应版本的存储路径,和运行时行为保持一致。
内容的提问来源于stack exchange,提问作者romandrovich
相关产品推荐
相关产品推荐

