DOBON.NET DOBON.NETプログラミング掲示板過去ログ

サービスのインストール後に登録もしたい。

環境/言語:[Windows XP]
分類:[.NET]

現在 C#.NET で Windowsサービス の開発をしています。

サービスプロジェクト がある ソリューション に「セットアップ/デプロイメント プロジェクト」-「セットアッププロジェクト」を追加し、Install.msi と言う セットアップEXE を作成しました。

その EXE にて インストール された サービス を サービス として登録したいのですが、その処理も Install.msi にて一括して行いたいのですが、よい方法はありますでしょうか?
> その EXE にて インストール された サービス を サービス として登録したいのですが、そ
>の処理も Install.msi にて一括して行いたいのですが、よい方法はありますで
>しょうか?

インストールした .exe を実行してサービスを登録する、カスタムアクションを定義すればいいんじゃないでしょうか。
ご回答ありがとうございますm(_ _)m


カスタムアクリョン と言うのは "カスタム動作" のことで良かったでしょうか!?

一応、別プロジェクト として CostomInstaller と言う プロジェクト と追加し、
そこの AfterInstall メソッド に 別作成した Install.bat を起動する様にしたのですが、下記の様な エラーメッセージ が出てしまいました。。。

-----------------------------------------------------
インストールを初期化中に例外が発生しました:
System.IO.FileNotFoundException: ファイルまたはアセンブリ名 MyService.exe
、またはその依存関係の1つが見つかりませんでした。
-----------------------------------------------------

ちなみに、別作成した バッチファイル は下記の様な作りです。
-----------------------------------------------------
%SystemRoot%\Microsoft.NET\Framework\v1.1.4322\installutil.exe MyService.exe
-----------------------------------------------------

普通に クリック起動すると、正常に登録できるのですが・・・
> カスタムアクリョン と言うのは "カスタム動作" のことで良かったでしょうか!?

そうですね。

> 一応、別プロジェクト として CostomInstaller と言う プロジェクト と追加し、

そんな面倒なことする必要がありましたっけ?

MSDN Library に「サービス アプリケーションへのインストーラの追加」というトピックがあるので、よく読んで参考にしてみてください


> MSDN Library に「サービス アプリケーションへのインストーラの追加」というトピックがあるので、よく読んで参考にしてみてください
>

チュートリアル : 動作の作成
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vsintro7/html/vxwlkWalkthroughCreatingCustomAction.asp
に従って、カスタム動作を作成⇒デプロイメント プロジェクトを追加⇒カスタム動作を追加してみました。

それでバッチの起動は出来たのですが、やはりエラーになってしまいました。


バッチ自体に問題があるのだと思い

---------------------------------------------------------
(バッチの内容)
%SystemRoot%\Microsoft.NET\Framework\v1.1.4322\installutil.exe MyService.exe
---------------------------------------------------------

MyService.exeをフルパスで指定してみたのですが、
エラーの内容が変わっただけで同じでした。

-----------------------------------------------------
(エラーの内容)
インストールを初期化中に例外が発生しました:
System.IO.FileNotFoundException: ファイルまたはアセンブリ名 Program
、またはその依存関係の1つが見つかりませんでした。
-----------------------------------------------------


ただ、フルパスに変更したら、普通にクリックしても同様のエラーが発生してしまう様になってしまいます。


カスタム動作の中で上記の様な内容のバッチを動かして、
サービス登録すること事態が不可能なのでしょうか?
>>MSDN Library に「サービス アプリケーションへのインストーラの追加」というトピックがあるので、よく読んで参考にしてみてください
>>
>
> チュートリアル : 動作の作成

それ違うし。

> カスタム動作の中で上記の様な内容のバッチを動かして、
> サービス登録すること事態が不可能なのでしょうか?

できますけど、前に書いたようにそんな面倒なことする必要は無いはずです。

サービスのインストールなら、前に紹介した MSDN のトピックに従ってサービスに自分自身のインストールクラスを追加し、それを呼び出すカスタムアクションを追加すればOKだったと思います。
物分りが悪くてスミマセンが、もう少しお付き合いくださいm(__)m

>>チュートリアル : 動作の作成
>
> それ違うし。


まず、[MyServiceプロジェクト] の [MyService.cs[デザイン]] で
【インストーラの追加】をクリックし [ProjectInstaller.cs] を作成し、
サービスの情報等を InitializeComponentメソッド に書き込みました。


ここまでは、ひどりさんに教えていただいた
『サービス アプリケーションへのインストーラの追加』の 手順 8 まで良いですよね!?


今回、私のやりたいコトは 手順 9 に該当すると思い、
『チュートリアル : 動作の作成』を参照したのですが、見当違いだった様ですね(^^;



私の考えとしては、

[インストーラの追加] で作成されるものは、InstallUtil.exe の実行時に起動されるもので
実際のアプリケーションの配置時に使用するものではないと思っていました。

なので、[セットアップ/デプロイメントプロジェクト] − [セットアッププロジェクト] を追加し、
Install.msi と言う セットアップEXE を作成し、そこに AfterInstallメソッドを追加すつるもりでした。

そのため、[プロジェクトの追加] で プロジェクト を CostomInstaller として追加し、
そこに [インストーラクラス] のファイルを追加して DLLファイルを作成した訳ですが・・・


結局のところは上手くいかず、
その発想はNGだったでしょうか!?
大分時間が空いたので解決しているかもしれませんが。。。

>まず、[MyServiceプロジェクト] の [MyService.cs[デザイン]] で
>【インストーラの追加】をクリックし [ProjectInstaller.cs] を作成し、
>サービスの情報等を InitializeComponentメソッド に書き込みました。

↑は、インストーラクラスのプロパティで、GUI で設定することもできますよ。

>ここまでは、ひどりさんに教えていただいた
>『サービス アプリケーションへのインストーラの追加』の 手順 8 まで良いですよね!?

はい、よさそうです。

>今回、私のやりたいコトは 手順 9 に該当すると思い、
>『チュートリアル : 動作の作成』を参照したのですが、見当違いだった様ですね(^^;

大ハズレではないんですが、少しズレてます。

>[インストーラの追加] で作成されるものは、InstallUtil.exe の実行時に起動されるもので
>実際のアプリケーションの配置時に使用するものではないと思っていました。

違います。

インストーラクラスは、Windows Installer から(ほぼ)直接呼び出されます。
InstallUtil.exe は介在しません。

>なので、[セットアップ/デプロイメントプロジェクト] − [セットアッププロジェクト] を追加し、
>Install.msi と言う セットアップEXE を作成し、そこに AfterInstallメソッドを追加すつるもりでした。

# .msi は .msi であって、.exe では無いです。
# という細かいツッコミは横に置いておきます。

>そのため、[プロジェクトの追加] で プロジェクト を CostomInstaller として追加し、
>そこに [インストーラクラス] のファイルを追加して DLLファイルを作成した訳ですが・・・

この辺の手順がまずいようです。

「[インストーラクラス] のファイルを追加して DLLファイルを作成」なんて手順が発生することはありません。

インストーラクラスは、Windows サービスのプロジェクトに追加されたものです。
その状態でビルドして、通常は Windows サービスの .exe と一体化させます。

デプロイメントプロジェクトには「インストールするべきファイル」として単純に Windows サービスの .exe を追加します。
(.exe を直接指定するのではなく、Windows サービスのプロジェクトのプライマリ出力を追加するのでも可)

その上で、「Windows インストーラの .exe」を、デプロイメントプロジェクトのすべてのカスタム動作に登録します。

インストーラクラスを含んだ .exe をカスタム動作に登録した場合、.exe が実行されるのではなく、.exe に収録されたインストーラクラスが実行されます。
Widows サービスに含まれたインストーラクラスが実行されると、Windows サービスの登録が行われます。

> 大分時間が空いたので解決しているかもしれませんが。。。

優先順位的に危機迫る方のお手伝いに借り出され、
サービスの方は後回しにせざるを得ない状況になってしまったため
実はまだ解決していませんでした(゚Д゚;)


来月中旬ごろには手が空く予定なので
それからになってしまうと思いますが、
結果の方、ご報告させてもらいます♪


本当にありがとうございましたm(_ _)m

DOBON.NET | プログラミング道 | プログラミング掲示板