TopShelfに関しては、サービスを作成するための優れたパターンがある可能性があります(わかりません、使用したことはありません)が、展開でカスタムアクションを使用している場合は、Windowsの方法でボートを見逃しています。インストーラーは動作するように設計されています。MSIの観点からは最適ではない主題について書かれたものがたくさんあるので、私は彼らを責めません。
私はこれについて6年前に最初に書いた:
MSIと.NET
問題は、MSIの基盤となるネイティブ機能を公開しなかったVisualStudio展開プロジェクトから始まりました。代わりに、より脆弱なソリューションで車輪の再発明を促進するインストーラークラスのカスタムアクションを作成しました。MSIは、プロセス外の命令型コードを挿入することではなく、宣言型プログラミングに関するものです。
サービスを処理するためのよりクリーンな方法は、次の場所にあります。
WindowsインストーラーXMLを使用したInstallShieldの拡張-Windowsサービス
コンセプトは、サービスをマージモジュールとしてカプセル化し、InstallShieldに追加することです。Visual Studio展開プロジェクトに追加することも、純粋なWiXにリファクタリングすることもできます。
netshコマンドについても同じことが言えます。このカスタムコードをすべて用意して、すべてのサービス戦略を正しく行う必要はありません。代わりに、WiXの組み込みのFirewallException Element(Firewall Extension)を使用して(これもカプセル化して他のツールで使用できます)、ハードワークを実行させます。
これが面白くても達成できないように思われる場合は、私を叩いてください。お見せします。誰かがわざわざ本を書き直すまで、私は一度に1人の開発者を説得する必要があります。