Visual Studio安装项目不删除DLL

时间:2014-04-23 02:54:02

标签: c# .net-4.0 console-application setup-project

我遇到有关Visual Studio安装项目和卸载应用程序的问题。

这是一个非常基本的安装程序,安装ApplicationLauncher.exe C#.NET 4.0控制台应用程序和Application.Common.dll(应用程序ApplicationLauncher.exe的依赖项)。

安装成功,将exe和DLL复制到程序文件文件夹C:\Program Files (x86)\Company\ApplicationLauncher\中。

卸载应用程序(通过MSI)时出现问题 - 卸载似乎很成功,但它会使Application.Common.dll落后,并且不会像我期望的那样将其删除。

我已经使用ProcessExplorer确保没有其他人在使用DLL,卸载期间没有打开资源管理器窗口。

这是预期的功能吗?我是否必须创建自定义操作来删除此DLL?或者我做错了什么? :S

4 个答案:

答案 0 :(得分:2)

似乎我能够通过重命名应用程序的解决方案和产品名称来解决此问题,我不确定这是如何修复的,但确实如此。

我在这里的唯一想法是遍历到安装程序,其中应用程序安装到不同的文件夹中,因此不对DLL应用相同的权限..

答案 1 :(得分:1)

不是预料到的,没有。如果您在设置中完成以下任何操作并安装它,就会发生这种情况:

将文件标记为永久。

将SharedLegacyFile文件标记为true。

这些是项目设置,但是如果你设置其中任何一个并进行安装,它将会留下来。您可以在安装项目中取消设置它们,但为时已晚 - 您已在系统上标记该组件的永久或共享。如果您使用全新系统(如新虚拟机),请重置这些值(如果已设置并重建MSI并进行安装/卸载,是否仍然会发生?)

答案 2 :(得分:0)

我遇到了同样的问题。然后我尝试在Windows XP上安装和取消我的应用程序,并且已经有效。

答案 3 :(得分:0)

重命名产品代码是针对症状而不是原因。当卸载程序不删除 dll 时会出现问题。下次安装将再次使用该 dll,并且无法在卸载事件中将其删除,因为其他程序仍在使用它。

这些步骤有望解决问题:

  1. 安装您的软件

  2. 打开 CMD(具有管理员权限)并运行:

    msiexec /x {ProductCode} /L*V "C:\CustomPath\FileName.log"
    

    在设置项目上按 F4 可以找到产品代码

  3. 打开日志文件并搜索如下所示的行:

    Disallowing uninstallation of component: {6CEC09F6-9108-7062-A692-2BCBACEE3BD8} since another client exists
    Disallowing uninstallation of component: {A0A0FA84-CC0D-C5C4-1F57-169788C4482D} since another client exists
    Disallowing uninstallation of component: {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} since another client exists
    
  4. 所有这些组件都必须手动从注册表中删除。为此,首先必须将 GUID(例如 {6CEC09F6-9108-7062-A692-2BCBACEE3BD8})转换为打包/压缩的 GUID(例如 6F90CEC6801926076A29B2DBCAEEB)。我找到了一个 Website,可以在其中运行脚本来执行此操作。在网站上找到以下代码,将右边的替换为日志中的GUID。

    string inStrGUID = "{6CEC09F6-9108-7062-A692-2BCBACEE3BD8}";
    
  5. 打开注册表(以管理员身份)并搜索(编辑 -> 查找...)以查找压缩的 GUID(通常它位于 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion 中的某个位置\Installer\UserData\S-1-5-18\Components\)

  6. 删除与压缩后的 GUID 相同的文件夹。文件夹内的值应该是 dll 的路径。

  7. 删除后选择父文件夹 (...\S-1-5-18\components) 并点击 Edit -> Find...

  8. 对日志文件中的所有组件重复这些步骤 (4-7)。

  9. 删除原始文件夹中所有未卸载的文件也是一个好主意。


可以防止这种情况发生吗?

我不知道。这真的不是那么容易重现。 SO 上的其他一些帖子怀疑 Visual Studio 中的安装/卸载选项是问题的原因,但我有不同的理论:

此错误可能是由于安装程序中 InstallExecuteSequence 中的 RemoveExistingProducts 执行得太晚,因此没有在正确的时间删除 dll。此错误已存在多年,可以通过执行 this 进行修复。如果您需要有关 Orca 的帮助,请this 说明如何安装它。