-2

Windowsサービスでセルフホストされた単純なwcfサービスを作成しようとしていますが、WindowsサービスのServiceHandleは常に0です。

RegisterDeviceNotificationを使用してハードウェアの変更を検出する必要があります。そのパラメーターの1つはHandleで、私の場合はServiceHandleです。

public partial class MyService : ServiceBase, IMyService
{
    private ServiceHost host;

public static void Main()
{
    ServiceBase.Run(new MyService());
}

public MyService()
{
    InitializeComponent();
}

protected override void OnStart(string[] args)
{
    try
    {
        host = new ServiceHost(typeof(MyService), new Uri(@"net.pipe://localhost/MyService"));
        host.Open();
    }
    catch (Exception e)
    {
        EventLog.WriteEntry("MyService:", e.Message);
    }
}

protected override void OnStop()
{
    host.Close();
}

#region IMyService Members

public void Register()
{
    //Here the ServiceHost is 0        
}
#endregion

}

何が問題を引き起こす可能性がありますか?ありがとう

4

1 に答える 1

1

Windows サービスとして WCF サービスをホストするために、ServiceHandle- どんな値でも - は必要ありません。ServiceHostinをインスタンス化しOnStartて閉じるだけでOnStop問題ありません。

ServiceHandleこれが、あなたのケースでは常に 0 である理由です:

Windows サービス クラスは、WCF サービス コントラクトを実装します。This is not a good thing and is also the cause for the ServiceHandleproperty being 0. WCF サービスを呼び出すたびに、MyServiceクラスの新しいインスタンスがインスタンス化されます (既定値を変更していない場合)。このインスタンスは、それが Windows サービスであることを認識しないクラスの通常インスタンスであるため、すべての Windows サービス関連のプロパティには既定値があります。Windows サービス マネージャーによって作成されたインスタンスだけに、すべての適切なプロパティが設定されています。

自分で試すことができます:OnStartに次の行を挿入し、 の値を調べますmyServiceVar.ServiceHandle。次のようになります0

MyService myServiceVar = new MyService();

本当にやり たいことは次のとおりです。たとえば、次のように、別のクラスにサービス コントラクトを実装させます。

public class MyWCFService : IMyService
{
    public static IntPtr ServiceHandle;

    public void Register()
    {
        // Use MyWCFService.ServiceHandle here
    }  
}

OnStartメソッドで、次の変数を設定しServiceHandleますMyWCFService

protected override void OnStart(string[] args)
{
    try
    {
        MyWCFService.ServiceHandle = this.ServiceHandle;

        host = new ServiceHost(typeof(MyWCFService), new Uri(@"net.pipe://localhost/MyService"));
        host.Open();
    }
    catch (Exception e)
    {
        EventLog.WriteEntry("MyWCFService:", e.Message);
    }
}
于 2012-06-06T09:11:28.553 に答える