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 インストーラーの組み込みメカニズムであるServiceInstallテーブルを使用します。

問題は、この機能を公開していない Visual Studio 展開プロジェクトを使用している可能性が高いことです。問題ない。Windows インストーラー XML を使用して、XE/サービス コンポーネントをカプセル化するマージ モジュールを作成します。次に、このマージ モジュールを VDPROJ インストーラーに追加します。

これを接続する方法については、次の記事を参照してください。

Windows Installer XML を使用した InstallShield の拡張 - 証明書

Windows Installer XML を使用した InstallShield の拡張 - Windows サービス

Visual Studio 展開プロジェクトの引き換え

于 2012-06-29T19:46:16.573 に答える