2010-05-24 20 views
5

Bir nesneyi bir pencere hizmetine iletmenin bir yolu var mı? MyServiceController.Star (string [] arg) yöntemini biliyorum ancak bir dize dizisinden daha karmaşık bir nesneyi geçirmem gerekiyor. Aslında, bir parametre olarak geçirilecek nesneye ihtiyacım yok, gerçekten ihtiyaç duyduğum şey, hizmetin bir windows form uygulamasında oluşturulan bir nesneyi kullanabilmesidir. Nesneyi bir Json'a dönüştürmek için System.Web.Script.Serialization.JavaScriptSerializer.Serialize yöntemini kullanmayı denedim, ancak nesne döngüsel bir başvuru içerdiğinden bulamadım. Ayrıca, işaretçiler kullanarak 'u denedim, ancak yönetilen bir nesne olduğundan emin değilim.Bir nesneyi pencere hizmeti için parametre olarak geçirme

Herhangi bir fikrim neler yapabilirim?

cevap

3

yerine (hizmet ayrı bir işlemde şekilde işlem çalışmaz) nesne itslef geçmesine çalışırken daha - veri bir Dışında referans geçmektedir. Örneğin, dosya yolu serileştirilmiş nesneyi içerir.

Ben servis de .NET uygulanan varsayıyorum? Eğer öyleyse, o zaman dairesel referanslar işleyeceği için ikili serileştirme (BinaryFormatter) kullanın. Ardından, isimlendirilmiş dosyadan yükleyerek hizmetinizde yeniden serileştirebilirsiniz.

Kullanıcı hizmetinizi yeniden ne olacağını düşünün isteyebilirsiniz

- bu bu durumda veri alır? Başlangıç ​​parametresi olmayacak. Serileştirilmiş nesnenin dosya adını saklamak için kayıt defterini kullanmak daha güçlü olabilir ve hizmetiniz başlangıçta bundan okunabilir. Daha sonra, makine yeniden başlatıldığında dahi, her zaman bu verileri, verileri yeniden başlatırken veya kullanıcı hizmeti yeniden başlattığında bulacaktır.

0

Windows hizmeti ile windows uygulaması arasında nesneleri kodlama formatı olarak XML kullanarak ve serileştirme işlemini kendim yapmak için bir veritabanı kullanıyorum. Bir veritabanında, iletişimi (kilitleme için) işlemlere katlayabilir, günlüğe kaydetme için ek alanlar ekleyebilir, tabloyu bir sıra olarak ele alabilir ve bir kilitlenmeden yeniden başlatmanız gerektiğinde kurtarmak için uygun bir yere sahip olabilirsiniz.

0

Tamamen Windows hizmet üzerinden iletişim ne kanallar bağlıdır. Bir web hizmeti olarak, özel bir soket/bağlantı noktası dinleyicisi çalıştırarak veya (.NET 4.0'da) bellek eşlemeli bir dosyayı veya adlandırılmış bir kanalı izleyerek dinleyebilir.

Sorunuz daha bir komut satırı "ana" yöntemine benzeyen bir (string [] args) yöntemini bahseder. Bu durumda, eğer bir windows servisi ise muhtemelen yanlış bir şeye bakıyorsunuzdur. Bir hizmet olarak çalıştırmak istediğiniz değil, argümanlar iletmek için bir windows hizmet EXE yürütme.

Bu yöntemlerin her biri

kendi tuhaflıklar kapsar. Ama temel olarak, verilerinizi referans veya değer serileştirme yoluyla marileştirmelisiniz.

2

En kolay yol, kendiliğinden barındırılan bir WCF hizmeti kullanıyor. Servis ve istemci aynı makinede bulunuyorsa, boru ciltleme adında bir bellek kullanabilirsiniz.

http://omegacoder.com/?p=101

http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx

veya istemci http://msdn.microsoft.com/en-us/library/ms733769.aspx

+1

Adlandırılan boruları ben önerecektim tam olarak ne olduğunu, farklı bir makinede bulunan eğer bir tcp bağlayıcı kullanabilirsiniz. – AaronLS

İlgili konular