卸载程序不会将复制的库删除到 VS2010 安装程序项目中的系统文件夹。

Posted

技术标签:

【中文标题】卸载程序不会将复制的库删除到 VS2010 安装程序项目中的系统文件夹。【英文标题】:Uninstaller doesn't delete copied library to System Folder in VS2010 installer project. 【发布时间】:2015-04-11 12:36:01 【问题描述】:

我有一个 Windows 桌面应用程序。我正在使用 microsoft visual studio 2010 安装程序项目准备 msi。出于我的目的,我需要在安装过程中将某个 DLL 复制到系统文件夹中。当我在安装完成后运行卸载程序时,它不会从系统文件夹中删除该库。

有没有办法做到这一点?

这是我的 UnInstaller.cpp

int _tmain(int argc, _TCHAR* argv[])

    //WinExec("msiexec.exe /i B49233F8-814D-432F-BE05-D6BA334A0087", SW_SHOW);
    WinExec("msiexec.exe /i 050E4942-5DF2-4F46-B6BC-1296761DA4C1", SW_SHOW);

【问题讨论】:

您如何确定您的应用程序是该 DLL 的唯一用户?系统文件夹是共享资源,一般不能因为安装了DLL就认为可以删除。 因为它只适用于我的应用程序。 如果 DLL 仅适用于您的应用程序。那你为什么将它安装在共享位置?这里有些东西没有意义,我对 MSI 在理解它应该做什么方面有类似的问题并不感到惊讶。 因为它是由 KISA 指定的。他们的规范迫使我这样做。无论如何,你知道我该怎么做吗? 我什至不知道 KISA 是什么,抱歉。 【参考方案1】:

如果您曾在安装程序中将该文件的属性标记为 Permanent 或 SharedLegacyFile 并安装了它,那么它将不会被卸载。它们不是您可以在项目中更改的设置并期望它们在系统上更改,因为系统会将它们标记为不卸载。例如,如果您查看 HKLM\Software\Microsoft\Windows\CurrentVersion\SharedDlls 并且文件的路径在那里,那么您不必要地将其标记为共享。

【讨论】:

我没听懂你说的。请你能详细说明一下吗?在哪里改变?我没有找到任何方法来更改特殊文件夹(例如系统文件夹)的属性。 我没有说系统文件夹,所以我不知道你的意思。我指的是您可能已标记为永久或 SharedLegacy 的文件。无论如何我都不建议更改任何内容,因为我列出了可能的原因,而您还没有说明您是否查看过注册表位置。【参考方案2】:

Windows Installer 最佳实践表明您应该避免将共享资源安装到 windows / system 文件夹中,并且当您必须将它们标记为永久时。

【讨论】:

以上是关于卸载程序不会将复制的库删除到 VS2010 安装程序项目中的系统文件夹。的主要内容,如果未能解决你的问题,请参考以下文章

如何完全卸载VS2010,每次重装后我的原来的设置还是没有改变啊

VS2010 安装项目在程序卸载时运行 .exe 或 C# 代码

2010.2.1 制作安装程序步骤

Microsoft Visual C++ 2017 Redistributable 卸载不了怎么办?

WIN7 从新安装VS2010" 应用程序错误报告"安装失败.之前安装过.后来用不到了,就卸载了,现在安装失败了..

visual studio installer 卸载时不能删除安装目录问题