2010-12-29 15 views
6

Windows Hizmetimin en son sürümünün yüklü olduğunu program aracılığıyla kontrol etmek istiyorum. Ben: Bana sürüm numarasını söyleyecektir ServiceController arabirimde bir şey görmüyorumYüklü bir servisin sürüm bilgilerini alın?

var ctl = ServiceController.GetServices().Where(s => s.ServiceName == "MyService").FirstOrDefault(); 
if (ctl != null) { 
    // now what? 
} 

. Nasıl yaparım?

+0

Bunu kontrol ettiniz mi ... http: //stackoverflow.com/questions/1357268/programmatically-retrieving-assembly-version-of-a-running-service –

+0

@Aaron - teşekkürler, bu başlamak için iyi bir yer ! :) –

cevap

8

ServiceController kayıt defterinin yürütülebilir yolunu almanın dışında bir yol olmadığını bilmiyorum.

private static string GetExecutablePathForService(string serviceName, RegistryView registryView, bool throwErrorIfNonExisting) 
    { 
     string registryPath = @"SYSTEM\CurrentControlSet\Services\" + serviceName; 
     RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView).OpenSubKey(registryPath); 
     if(key==null) 
     { 
      if (throwErrorIfNonExisting) 
       throw new ArgumentException("Non-existent service: " + serviceName, "serviceName"); 
      else 
       return null; 
     } 
     string value = key.GetValue("ImagePath").ToString(); 
     key.Close(); 
     if(value.StartsWith("\"")) 
     { 
      value = Regex.Match(value, "\"([^\"]+)\"").Groups[1].Value; 
     } 

     return Environment.ExpandEnvironmentVariables(value); 
    } 

exe ​​yolunu aldıktan sonra, sadece sürümünü almak için FileVersionInfo.GetVersionInfo(exePath) sınıfını kullanın: Burada

önce yarattığı bir örnektir.

+0

+1 Teşekkürler! Bir 'FileVersionInfo' ile Assembly.GetAssembly (...) 'dan geri döndüğünüz' Version' nesnesini nasıl karşılaştırırsınız? –

+1

Bu, FileVersion verdiğinizde, AssemblyVersion olanıdır. AssemblyVersion'a ihtiyacınız varsa, onu bir montaj olarak (bahsettiğiniz gibi) yüklemeniz gerekir. Ama ** YÜKLENİYOR ** yüklendikten sonra, işleminiz sonlanana kadar dosyayı (ReflectionOnly olarak yükleseniz bile) kilitlediniz. – Aliostad

+0

Regex'in burada ne yaptığını merak ediyorum. "Eğer değer bir alıntıyla başlarsa, o zaman ..." Öyleyse, öndeki ve sondaki alıntıları kesiyor gibi görünüyor - değer ile aynı - value.Trim (yeni [] {'"'}); ama başka bir şey mi yapıyor? – ckittel

0

Hizmetin sahibi sizseniz, sürüm bilgilerini DisplayName, örn. DisplayName="MyService 2017.06.28.1517". Eğer kayıt kaçınmak istiyorsanız

var ctl = ServiceController 
    .GetServices() 
    .FirstOrDefault(s => s.ServiceName == "MyService"); 
if (ctl != null) { 
    // get version substring, you might have your own style. 
    string substr = s.DisplayName.SubString("MyService".Length); 
    Version installedVersion = new Version(substr); 
    // do stuff, e.g. check if installed version is newer than current assembly. 
} 

yararlı olabilir: Bu, hizmetin varolan yüklemesini bulmak ve sürüm bilgisini ayrıştırmak için izin verir. Sorun şu ki, servis girişleri, kurulum rutinine bağlı olarak kayıt defterinin farklı bölümlerine gidebilir.