Wix技术方案:升级程序时移除旧MSI标记为Permanent的GAC文件
如何通过WiX移除旧版本标记为Permanent的GAC文件
当然可以通过WiX代码实现这个需求,完全不用手动删除这些GAC文件!下面我来给你详细讲具体的实现方法和注意事项:
核心思路
标记为Permanent的组件默认不会在卸载或升级过程中被Windows Installer移除,但我们可以在新版本的WiX项目中,通过配置特定的删除操作,强制触发这些GAC文件的移除,不需要手动干预。
具体实现步骤
1. 准确定位目标GAC文件
GAC文件的存储路径分两种情况:
- .NET Framework的GAC通常在
%windir%\assembly下,按架构(如GAC_MSIL、GAC_32)分类存储 - .NET Core/.NET 5+的GAC在
%windir%\Microsoft.NET\assembly下
关键是要获取旧文件的完整强名称,比如YourOldAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abc123def456.dll——GAC中的文件是通过强名称唯一标识的,必须精准匹配。
2. 使用RemoveFile元素配置删除操作
在新版本的WiX项目中添加一个专门用于删除旧GAC文件的组件,通过RemoveFile元素指定要删除的文件:
<!-- 首先定义GAC对应的目录 --> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="WindowsFolder" Name="WINDOWS"> <Directory Id="GAC_DIR" Name="assembly"> <Directory Id="GAC_MSIL_DIR" Name="GAC_MSIL" /> </Directory> </Directory> </Directory> <!-- 删除旧GAC文件的组件 --> <Component Id="RemoveOldGACAssembly" Guid="PUT-YOUR-UNIQUE-GUID-HERE" Directory="GAC_MSIL_DIR"> <!-- On="install"表示在新版本安装时执行删除 --> <RemoveFile Id="DeleteOldAssembly" Name="YourOldAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abc123def456.dll" On="install" /> <!-- 可选:添加注册表项标记删除操作,便于后续排查 --> <RegistryValue Root="HKLM" Key="Software\YourCompany\YourProduct" Name="RemovedOldGAC" Value="1" Type="integer" /> </Component>
3. 将组件关联到安装Feature
确保这个删除组件被包含在你的安装Feature中,这样安装时才会执行:
<Feature Id="MainFeature" Title="Main Feature" Level="1"> <ComponentRef Id="RemoveOldGACAssembly" /> <!-- 其他组件引用 --> </Feature>
4. 处理旧组件的Permanent属性(关键)
如果旧版本的组件标记了Permanent="yes",你需要在新版本的MSI中告诉Windows Installer可以移除它:
- 在新版本的组件中设置
Permanent="no" - 同时添加
ForceRemove="yes"属性,强制Windows Installer忽略旧组件的永久标记
注意事项
- 权限要求:修改GAC需要管理员权限,所以你的MSI必须以管理员身份运行(可以通过WiX的
Package元素设置InstallPrivileges="elevated") - 测试验证:一定要在测试环境或虚拟机中先验证,避免误删其他依赖文件
- 强名称准确性:如果强名称匹配错误,删除操作会失效,建议直接从GAC中复制完整的文件名
内容的提问来源于stack exchange,提问作者Sanchit Dass
相关产品推荐
相关产品推荐

