C# 如何在自定义卸载操作中获取安装目录(使用MSI安装,使用VS2010创建)?

C# 如何在自定义卸载操作中获取安装目录(使用MSI安装,使用VS2010创建)?,c#,visual-studio,installation,windows-installer,C#,Visual Studio,Installation,Windows Installer,因此,我使用一个安装项目为我的应用程序创建了一个简单的msi设置,并添加了两个自定义操作,用于处理从归档文件中提取文件之类的事情。现在,在我的程序文件-目录中有两个额外的文件,这意味着MSI不会在卸载时自行删除该目录。我的解决方案是创建一个自定义操作来删除其余的文件 现在,只要在安装时使用默认目录,就可以很好地工作。但是如果用户选择改变它呢?我假设在自定义操作中必须有一种非常简单的方法来读取目录,但我不太确定这是什么 据我通过谷歌搜索发现,有一些属性与MSI包相关,比如TARGETDIR。然而,

因此,我使用一个安装项目为我的应用程序创建了一个简单的msi设置,并添加了两个自定义操作,用于处理从归档文件中提取文件之类的事情。现在,在我的程序文件-目录中有两个额外的文件,这意味着MSI不会在卸载时自行删除该目录。我的解决方案是创建一个自定义操作来删除其余的文件

现在,只要在安装时使用默认目录,就可以很好地工作。但是如果用户选择改变它呢?我假设在自定义操作中必须有一种非常简单的方法来读取目录,但我不太确定这是什么

据我通过谷歌搜索发现,有一些属性与MSI包相关,比如TARGETDIR。然而,一些网站也说我应该在安装阶段自己设置这个属性

这一切让我很困惑。基本上,我认为有两种方法可以解决这个问题:

1) 确保应用程序不会自行创建文件,MSI会处理它。这将意味着更多的工作,因为我不负责这些额外的文件

2) 在卸载应用程序时,在自定义操作中查找安装目录,并自行删除最后一位。在我看来,这是一种既快又脏的方式,现在已经足够了。但如何做到这一点呢


我在这里的时候,我还可以再问一个相关的问题。正如我前面提到的,我在安装时提取了一些文件。现在,一旦我提取了这些档案,我想把它们处理掉。问题是,如果我这样做,MSI会认为我的安装被破坏,并在每次启动应用程序时将它们复制回来。那么如何避免这种情况呢?

无需使用自定义操作来删除文件。MSI通过两个步骤构建了对该场景的支持:

  • 使用搜索查找要删除的文件。这里有一个教程

  • 然后您可以安排文件删除操作以实际删除文件。

  • 关于你的第二个问题:

    不要将存档添加到文件表中。相反,创建一些自解压归档文件并使用二进制自定义操作来解压它们


    您为什么需要归档?直接将所有文件放入MSI:它将处理解包(安装)文件和删除(卸载)文件。而且不需要自定义操作。我需要存档,因为需要的文件数量高达数万个。为什么你认为MSI无法以本机方式处理它们?因为即使添加所有这些文件也会非常痛苦,而且需要数小时。如果我真的将所有文件直接添加到安装程序中,我甚至不敢考虑构建安装程序的时间。如果您以本机方式添加这些文件,您也会遇到问题,因为每个功能的组件数量有一个软限制。参考:好的,已经有一段时间了,我还没有时间真正实现这个。现在我知道了,我不太清楚不将归档添加到文件表是什么意思。问题是,我已经使用了我在安装时运行的自解压归档,但是我如何才能真正地将这些文件捆绑到我的MSI安装程序中,而不将它们添加到文件表中呢?