6

Windows サービスのセットアップを作成したいと考えています。Windows サービスの dll は /Lib/ フォルダーに配置されます。

サービスにインストーラー クラスを追加しました。そして、セットアップ プロジェクトにカスタム アクションを追加しました。

問題は、サービスをインストールしようとすると、次のエラーで失敗することです: エラー 1001. でインストーラーの種類を取得できません ...

このエラーは、dll がサービス .exe と同じディレクトリにないために発生します。サービス構成でプローブを使用していますが、インストールユーティリティはそのプローブを認識しません..

私はその問題の回避策を見つけたかったので、サービス コントローラー (sc.exe) を使用してサービスを作成するためにさまざまな方法を試しました。cmd.exe を使用してカスタム アクションとして実行しようとしています。等..

これは一般的な問題であるはずです..誰かがそれに対する適切な解決策を見つけましたか?

4

3 に答える 3

2

私は同じ問題を抱えていましたが、この投稿または MSDN で提案されているオプションはどれも役に立ちませんでした。私は別の解決策を考え出しました:

InstallUtil.exe で Reflector を使用することで、InstallUtil が try/catch ブロック内で呼び出すためのシン ラッパーにすぎないSystem.Configuration.Install.ManagedInstallerClass.InstallHelper(args)ことがわかりました (現在のスレッドの UI カルチャを設定し、著作権も表示します)。ManagedInstallerClass.InstallHelperそれ自体は System.Configuration.Install.dll アセンブリにあり、誰でもアクセスできます。したがって、Program.Mainインストールを許可するようにサービスのメソッドを変更しただけです。以下の簡単なコードを参照してください。

static class Program
{
    static void Main(string[] args)
    {
        if (args != null && args.Any(arg => arg == "/i" || arg == "/u"))
        {
            // Install or Uninstall the service (mimic InstallUtil.exe)
            System.Configuration.Install.ManagedInstallerClass.InstallHelper(args);
        }
        else
        {
            // Run the service
            System.ServiceProcess.ServiceBase[] ServicesToRun;
            ServicesToRun = new System.ServiceProcess.ServiceBase[] 
            { 
                new MyService() 
            };
            System.ServiceProcess.ServiceBase.Run(ServicesToRun);
        }
    }
}

同じことを行うことも、独自のバージョンの InstallUtil を作成することもできます。

于 2014-03-25T13:11:38.187 に答える
0

設定で、プローブ パスを追加できます。これは、アセンブリを探すランタイムへのヒントです http://msdn.microsoft.com/en-us/library/823z9h8w%28v=vs.80%29.aspx

于 2012-07-03T15:15:00.893 に答える
0

イベントにバインドしAppDomain.AssemblyResolve、イベント ハンドラーでカスタム ロードを行う必要があります。

サンプルは、この SO の質問に対する最初の回答にあります。

于 2012-07-03T14:43:36.640 に答える