【问题标题】:Visual Studio Setup Project not removing DLLVisual Studio 安装项目不删除 DLL
【发布时间】:2014-06-07 16:13:19
【问题描述】:

我在 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

【问题讨论】:

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


    【解决方案1】:

    这不是预期的,不。如果您在设置中执行了以下任何操作并安装了它,就会发生这种情况:

    将文件标记为永久。

    将文件 SharedLegacyFile 标记为 true。

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

    【讨论】:

    • 我从未将文件 Permanent 或 SharedLegacyFile 设置为 true,是的,我已尝试重置值并重建 MSI,但它仍然留下 DLL :(
    • 使用 msiexec /x {productcode guid in braces} /l*v 进行卸载,也许日志会说明原因。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。然后我尝试在 Windows XP 上安装和卸载我的应用程序并且成功了。

      【讨论】:

        【解决方案4】:

        重命名 ProductCode 是治标不治本。当卸载程序没有删除 dll 时,就会出现问题。下一次安装将再次使用该 dll,并且无法在卸载事件中将其删除,因为它仍被其他程序使用。

        这些步骤有望解决问题:

        1. 安装您的软件

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

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

          在设置项目上按 F4 可以找到 ProductCode

        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(例如 6F90CEC6801926076A29B2BCCAEEB38D)。我找到了一个 Website,可以在其中运行脚本来执行此操作。在网站上找到以下代码,将右侧的替换为日志中的 GUID。

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

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

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

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

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


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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多