Visual studio 2017 如何防止Wix在安装时覆盖目录

Visual studio 2017 如何防止Wix在安装时覆盖目录,visual-studio-2017,installation,directory,wix3.11,Visual Studio 2017,Installation,Directory,Wix3.11,我有一个Windows应用程序,它有两个版本,有点像,但每个版本的名称不同。我使用相同的.wxs进行构建,因为我没有理由创建第二个wix项目。我不想在这里争论这是否是个好主意 问题是:每个版本都必须安装在 path\mainDir\versionDir 其中path\mainDir对于每个版本都是相同的。 我的问题是mainDir在安装时被每个版本完全覆盖。 假设我安装了版本1,我将 path\mainDir\version1Dir 然后如果我安装版本2,而不是 path\mainDir\ver

我有一个Windows应用程序,它有两个版本,有点像,但每个版本的名称不同。我使用相同的.wxs进行构建,因为我没有理由创建第二个wix项目。我不想在这里争论这是否是个好主意

问题是:每个版本都必须安装在

path\mainDir\versionDir

其中path\mainDir对于每个版本都是相同的。 我的问题是mainDir在安装时被每个版本完全覆盖。 假设我安装了版本1,我将

path\mainDir\version1Dir

然后如果我安装版本2,而不是

path\mainDir\version1Dir
path\mainDir\version2Dir

我要

path\mainDir\version2Dir

我一直在尝试使用,但它只适用于文件,因为无法将条件分配给目录(或者可能我还没有找到如何这样做,我不知道)

我的目标是让每个版本都能够安装在自己的目录中,如果mainDir不存在,则创建mainDir,但只有当mainDir为空时才将其删除。

这里的代码,任何线索将非常感谢

<!-- This is in Product, I'm just pasting it here -->
<Property Id="ALREADYINSTALLED">
    <RegistrySearch Id="InstallPath" Key="Software\$(var.MainDir)" Name="MainFolder" Root="HKCU" Type="directory" />
</Property>
<Property Id="SECONDALREADYINSTALLED">
    <RegistrySearch Id="SecondInstallPath" Key="Software\$(var.MainDir)\$(var.SecondDir)" Name="SecondFolder" Root="HKCU" Type="directory" />
</Property>

<Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="WINDOWSVOLUME">
        <Directory Id="INSTALLFOLDER" Name=".">
          <Directory Id="MAINFOLDER" Name="$(var.MainDir)">
            <!-- Allows the removal of this directory on uninstall -->
            <Component Id="mainFolderRemoval">
              <RegistryValue Root="HKCU" Key="Software\$(var.MainDir)" Name="MainFolder" Type="string" KeyPath="yes" />
              <RemoveFolder Id="removal" On="uninstall" Property="ALREADYINSTALLED"/>
            </Component>

            <Directory Id="SECONDFOLDER" Name="$(var.SecondDir)">   
                <Component Id="secondFolderRemoval">
                  <RegistryValue Root="HKCU" Key="Software\$(var.MainDir)\$(var.SecondDir)" Name="SecondFolder" Type="string" KeyPath="yes" />
                  <util:RemoveFolderEx On="uninstall" Property="SECONDALREADYINSTALLED"/>
                </Component>
            </Directory>
          </Directory>
        </Directory>
      </Directory>
    </Directory>

    <SetDirectory Id="WINDOWSVOLUME" Value="[WindowsVolume]" />
    <!-- Overwrites the main folder if already installed -->
    <SetDirectory Id="MAINFOLDER" Value="[ALREADYINSTALLED]"> <![CDATA[ALREADYINSTALLED]]> </SetDirectory>
</Fragment>

所以我最终找到了它不起作用的原因。 您必须确保每个版本的产品升级代码都不同,这一点非常明显

有人可能会说我应该删除这篇文章,但我相信这可能会发生在任何人身上,这是一个太愚蠢的问题,不能让人们在这件事上浪费时间。我将把这个问题作为一个例子,希望它对将来的人有用