我正在尝试使用Windows安装程序创建一个应用程序,因为它是安装方法。当安装成功时,我想获得我在安装程序中配置的主输出所在的路径。在我的情况下,主要输出位于文件夹[ApplicationData(Installroot)]\Bin\
。
我的类库中还有一个名为App.Settings的自定义设置文件,它控制多个设置,例如相对于安装位置的文件位置。
所以我的想法是,当安装成功时,它应该调用App.Settings并将安装文件夹保存到设置文件中。
我已经创建了一个Install类并将其放在类库中。我不确定它是否应该在该项目中。 这是Install Class的代码:
using System.Collections;
using System.ComponentModel;
namespace WaspbaneModels
{
[RunInstaller(true)]
public partial class Installer : System.Configuration.Install.Installer
{
public Installer()
{
InitializeComponent();
}
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
}
public override void Commit(IDictionary savedState)
{
base.Commit(savedState);
SettingsControl.BaseURL = Context.Parameters["assemblypath"];
SettingsControl.Save();
}
public override void Rollback(IDictionary savedState)
{
base.Rollback(savedState);
}
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);
}
}
}
在此代码中,SettingsControl是仅使用某些属性来处理“设置”的类。我使用这个类,以便我的Windows窗体项目也可以访问这些设置。
在“自定义操作”选项卡中,我还将主要输出添加到所有内容。我也不确定这是否正确,因为我认为主要输出包含所有.dll文件,包括类库。
我不确定从这一点开始继续,但是因为没有保存设置。我只是通过在应用程序启动时设置一个消息框来检查这一点,并给出设置值。
任何对项目更多数据感兴趣的人都会问。我暂时不会发布所有内容。
编辑:
经过一些测试后,我设法发现没有调用Installer类。我添加了一些东西,当这个方法被调用但没有发生任何事情时会写入文件。
因此我现在的问题是:如何正确地将自定义操作添加到安装项目?
答案 0 :(得分:2)
您可以将自定义操作类(.dll)添加到安装项目中。您必须将 InstallerActions .dll添加到“安装”和“提交”操作中。
添加自定义操作
答案 1 :(得分:1)
设置范例不适用于安装程序类,因为您不在运行的应用程序上下文中。您是通过使用系统帐户运行的msiexec.exe进程通过反射调用的,没有任何工作目录上下文。人们通常直接在设置文件上使用Xml处理来解决此问题。您需要命名设置文件的完整路径,因为您再次从msiexec.exe进程作为回调运行。
自定义操作不需要是Commit自定义操作,因为所有VS自定义操作在安装所有文件后运行。您需要提交自定义的唯一操作是当您运行的代码依赖于在WinSxS上安装到GAC的文件时,因为它们在提交时间之前无法访问。
答案 2 :(得分:0)
我有同样的问题。经过无奈后,我发现msi安装程序仅在RemovePreviousVersions = true
更新期间使用第一次安装时应用程序的安装程序类。因此,如果您卸载该应用程序并重新安装,它将起作用。
作为一种解决方法,我发现在安装过程中卸载早期版本可以解决此问题。必须将RemoveExistingProducts
的序列号在msi安装程序documented in SO here中移到较低的值。这可以使用orca手动完成,也可以通过运行here作为VS PostBuildEvent运行vbs脚本来自动完成:
cscript.exe ..\Msi_Fix_RemoveExistingProducts_Record.vbs yourOutput.msi
不幸的是,安装程序类仍需要两次更新才能正确渗透到安装程序中。大概可以通过在msi文件中的RemoveExistingProducts
上添加一个更低的序列号来解决此问题,但是我现在已经摆弄了它。