3

我有以下代码,但虽然我可以访问一个属性并检索一个值

 this.Context.Parameters["SERVICENAME"] 

在 BeforeInstall 中,相同的属性在 OnCommitted 中返回“”。

这些数据去哪里了,它是如何被擦除的,我在哪里可以找到这些方法中的每一个的顺序的细目,以及什么被传递到哪里?

[RunInstaller(true)]
    public partial class ProjectInstaller : System.Configuration.Install.Installer
    {

        public string ServiceName { get; protected set; }

        /// <summary>
        /// 
        /// </summary>
        public ProjectInstaller()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="savedState"></param>
        protected override void OnBeforeInstall(IDictionary savedState)
        {
            base.OnBeforeInstall(savedState);
            this.ServiceName = this.Context.Parameters["SERVICENAME"].ToString();
            this.serviceInstaller1.ServiceName = this.ServiceName;
            this.serviceInstaller1.DisplayName = this.ServiceName;
        }

        /// <summary>
        /// /
        /// </summary>
        /// <param name="savedState"></param>
        protected override void OnCommitted(IDictionary savedState)
        {
            base.OnCommitted(savedState);
            string targetDirectory = Path.GetDirectoryName(Context.Parameters["AssemblyPath"]); ;
            string path = System.IO.Path.Combine(targetDirectory, "Services.Win32.exe.config");
            System.Xml.XmlDocument xDoc = new System.Xml.XmlDocument();
            xDoc.Load(path);
            System.Xml.XmlNode node = xDoc.SelectSingleNode("/configuration/applicationSettings/Services.Win32.Properties.Settings/setting[@name='TaskManagerServiceName']/value");
            node.InnerText = (this.ServiceName); // here this.ServiceName is "" so was this.Context.Parameters[""SERVICENAME"] when i was using that
            xDoc.Save(path);
        }
4

3 回答 3

5

我在尝试向现有部署项目添加其他参数时遇到了这个问题。参数已传递给安装程序,但在Context.Parameters. 事实证明,需要将可访问的参数添加到该自定义操作的“自定义操作数据”中。

您可以通过右键单击.vdproj项目并选择View -> Custom Actions. 从那里您可以找到自定义操作的主要输出。通过右键单击所需步骤(安装、提交、回滚或卸载)中的主要输出并选择属性,您可以编辑该步骤的自定义操作数据您可以在此处找到该属性的格式。

希望它会节省一些人的时间,因为我花了很长时间才弄清楚这一点。

于 2012-10-24T09:19:25.357 回答
1

最简单、最干净和最强大的解决方案是不使用安装程序类自定义操作来安装服务。使用 Windows Installer 的内置机制:ServiceInstall表。

问题是您可能正在使用不公开此功能的 Visual Studio 部署项目。没问题。使用 Windows Installer XML 创建一个封装 XE/Service 组件的合并模块。然后将此合并模块添加到您的 VDPROJ 安装程序。

有关如何连接它的想法,请参阅以下文章:

使用 Windows Installer XML 增强 InstallShield - 证书

使用 Windows Installer XML 增强 InstallShield - Windows 服务

Visual Studio 部署项目的赎回

于 2012-06-29T19:46:16.573 回答
0

可以在 Installer 类的 Install 和 Uninstall 覆盖上访问它:

这里有一个完整的例子:

[RunInstaller(true)]
public partial class ProjectInstaller : System.Configuration.Install.Installer
{

    public ProjectInstaller()
    {
        InitializeComponent();              
    }

    public override void Install(System.Collections.IDictionary stateSaver)
    {
        UpdateServiceName();
        base.Install(stateSaver);
    }

    public override void Uninstall(System.Collections.IDictionary savedState)
    {
        UpdateServiceName();
        base.Uninstall(savedState);
    }
    private void UpdateServiceName()
    {
        var serviceName = Context.Parameters["servicename"];

        //if service name was set has install parameter then override the value set on the designer:
        if (!string.IsNullOrEmpty(serviceName))
        {

            //serviceInstaller1 is the `ServiceInstaller` component drag to install designer.
            this.serviceInstaller1.ServiceName = serviceName;

            //Since user can change service name and do multiple side installs, by keep the display names similar it can help to keep those side installs packed in Service Management Console.
            this.serviceInstaller1.DisplayName = $"{this.serviceInstaller1.DisplayName} ({serviceName})";
        }
    }
}
于 2020-04-27T12:55:36.003 回答