Installation 安装项目不替换程序集文件

Installation 安装项目不替换程序集文件,installation,windows-installer,Installation,Windows Installer,我有一个Windows应用程序项目 (A.exe)调用另一个项目 类库(B.dll) A.exe有一个按钮(myButton),用于 从B.dll调用方法Method1 安装我创建的应用程序 安装项目ASetup.vdproj,其 主要输出是项目A 编译安装程序后 安装运行时没有任何 问题,当A.exe启动并且我 单击My按钮,应用程序将给出 没有错误 然后我更改了B.dll并添加了一个新的 方法2 myButton现在正在从调用Method2 B.dll而不是Method1 我增加了A.exe

我有一个Windows应用程序项目 (A.exe)调用另一个项目 类库(B.dll)

  • A.exe有一个按钮(myButton),用于 从B.dll调用方法Method1

  • 安装我创建的应用程序 安装项目ASetup.vdproj,其 主要输出是项目A

  • 编译安装程序后 安装运行时没有任何 问题,当A.exe启动并且我 单击My按钮,应用程序将给出 没有错误

  • 然后我更改了B.dll并添加了一个新的 方法2

  • myButton现在正在从调用Method2 B.dll而不是Method1

  • 我增加了A.exe的版本,并且 增加的版本 ASetup.vdproj,但不增加 B.dll的版本

  • 安装应用程序后,我 注意到我有两套 控制面板->添加中的A.exe/ 删除程序

  • 运行A.exe并单击 myButton我得到了一个错误 在中未找到方法2 B.dll”,这意味着安装程序 在运行期间不替换B.dll 安装

  • 我运行卸载程序,发现 文件没有被删除 从磁盘

  • 我的问题是:

    为什么第二次安装不更新B.dll? 如果B.dll的版本增加,则在安装过程中会替换B.dll,但问题是我当前的项目有许多外部程序集,很难控制它们是否已被修改。基本上,我想要的是在每次安装中替换所有程序集文件

    我等待你们所有人的反馈。
    感谢您的关注。

    添加/删除程序中的两个条目告诉我您更改了ProductCode属性,但升级表中没有有效的行来正确定义主要升级。MSI将其视为两个不同的产品,它们恰好安装到同一目录中。卸载这两个产品中的一个时,文件将保留,直到卸载另一个产品


    未被覆盖的DLL向我表明,您没有将AssemblyFileVersion属性从一个版本更改为另一个版本。第一次安装是在1.0.0.0中复制的,第二次安装说“1.0.0.0已经存在,这里没有什么要做的”并跳过它。

    除了@Christopher Painter提到的问题外,很可能还有另一个问题:使用Visual Studio(2008)创建的安装项目仅在版本号增加时才会替换文件。显而易见的解决方案是增加所有版本号;然而,这可能并不总是你想要的

    .msi文件的行为基本上由执行操作的时刻决定。使用VS 2008创建的安装程序在安装新产品后安排此操作。因此,版本未增加的已修改程序集不会被替换。有关更新行为的更多详细信息,请参见本线程:

    要更改该行为,可以修补已创建的.msi文件,以便在安装新产品之前执行该操作(如果使用Visual Studio 2005创建安装程序,则实际上就是这种行为)。例如,可以使用一个小的VBScript进行修补,该脚本作为后期构建步骤运行:

    Dim objInstaller
    Dim objDatabase
    Dim objView
    Dim objResult
    
    Dim strPathMsi 
    
    If WScript.Arguments.Count <> 1 Then
        WScript.Echo "Usage: cscript fixRemovePreviousVersions.vbs <path to MSI>"
        WScript.Quit -1
    End If
    
    strPathMsi = WScript.Arguments(0)
    
    Set objInstaller = CreateObject("WindowsInstaller.Installer")
    Set objDatabase = objInstaller.OpenDatabase(strPathMsi, 1)
    Set objView = objDatabase.OpenView("UPDATE InstallExecuteSequence SET Sequence=1450 WHERE Action='RemoveExistingProducts'")
    
    WScript.Echo "Patching install sequence: UPDATE InstallExecuteSequence SET Sequence=1450 WHERE Action='RemoveExistingProducts'"
    objView.Execute
    objDatabase.Commit
    
    WScript.Quit 0
    
    Dim objInstaller
    Dim objDatabase
    模糊objView
    模糊目标结果
    暗strPathMsi
    如果WScript.Arguments.Count为1,则
    Echo“用法:cscript fixRemovePreviousVersions.vbs”
    WScript.Quit-1
    如果结束
    strPathMsi=WScript.Arguments(0)
    设置objInstaller=CreateObject(“WindowsInstaller.Installer”)
    设置objDatabase=objInstaller.OpenDatabase(strPathMsi,1)
    Set objView=objDatabase.OpenView(“更新InstallExecuteSequence Set Sequence=1450,其中Action='RemoveExistingProducts'))
    Echo“修补安装顺序:更新InstallExecuteSequence SET sequence=1450,其中Action='RemoveExistingProducts'”
    objView.Execute
    objDatabase.Commit
    WScript.0退出
    
    我一直在使用VDPROJ,很快你就会有几十个这样的后期构建脚本来回避VDPROJ糟糕的事实。现在将VDPROJ转储为另一个工具(WiX或IS 2010 LE),您将拥有更长的使用寿命。:-)顺便说一句,在我的CM专家说,它是疯狂的故意船舶2 MSI的不同程序集具有相同的文件版本。可追溯性是至关重要的。@Christopher Painter:没错。这个“SET Sequence=1450”命令的意义是什么?有没有办法查看我假设嵌入在MSI某处的“数据库”?@Qwertie:这会改变安装过程中执行RemoveExistingProducts操作的时刻。如果您想查看MSI数据库,可以使用Orca()。@Qwertie:the.MSI文件是一个数据库。