2014-04-12 20 views
5

C# uygulamasındaki server.exe benim iş operasyonları için kritik öneme sahiptir ve ideal olarak 7/24 kesintisiz çalışmalıdır. Kod, sağlam bir katıdır ancak kontrolüm dışında kalan bir şey, üçüncü taraflarca üretilen gelen veri feed'lerinin kalitesizliğidir. Bazen bu sana mecbur durumda anormallikleri içeren veri beslemeleri alırsınız: server.exe içinde yem işleme kodu, yeni kodu kullanarak anomaliyi C# uygulamamın bir bölümünü, uygulamanın yeniden başlatılmadan dinamik olarak yüklenmesini nasıl sağlayabilirim?

  • yeniden derleme
  • yeniden başlatma server.exe karşılamak için

    • güncelleme ve sözdizimsel izin kusurlu yem

    tüm süreç genellikle birkaç dakika ama server.exe yeniden başlatılmasına daha az sürer belli olmayan kritik durum bilgilerinin sıfırlama neden olur işlenecek ve daha da kötüsü, server.exe.

    Benim gol bağlı harici süreçlerin bir bozulmaya neden olur: içerikleri server.exe yeniden başlatmadan güncellenebilir ayrı DLL içine yem işleme kodunu izole edin. Bunu nasıl yaparım?

    beni şimdiye kadar öncesinde bu forumu yazı yazmaya ne yaptık açıklamaya izin ver:

    besleme işlemci arayüzü common.dll adlı yeni meclise taşındı.

    public interface IFeedProcessor{ 
        bool ProcessFeed(String filePath); //returns false on failure, true on success 
    } 
    

    Server.exe şimdi common.dll başvuruyor: arayüz şuna benzer.

    Yem işlemcileri, feedProcessors.dll adı verilen yeni bir gruba taşındı.

    internal class FeedProcessor1:IFeedProcessor{ 
        public FeedProcessor1(){} 
        bool ProcessFeed(String filePath){/*implementation*/return true;} 
    } 
    
    internal class FeedProcessor2:IFeedProcessor{ 
        public FeedProcessor2(){} 
        public bool ProcessFeed(String filePath){/*implementation*/return true;} 
    } 
    
    [... and so on...] 
    

    feedProcessors.dll da bazı yapılandırma girişlerine dayalı olarak belirli bir besleme işlemci oluşturmak için kullanılan FeedProcessorUtils adında bir sınıf içerir: uygulamaları şuna benzer. Şöyle bir şeye benziyor:

    public class FeedProcessorUtils{ 
        public static void CreateFeedProcessor(int feedType /*and other configuration params*/){ 
         switch(feedType){ 
          case 1:return new FeedProcessor1(); 
          case 2:return new FeedProcessor2(); 
          default: throw new ApplicationException("Unhandled feedType: "+feedType); 
         } 
        } 
    } 
    

    Her şey daha önce olduğu gibi çalışıyor ancak elbette dinamik yükleme problemimi çözmüyor; feedProcessors.dll'u yeni kodla güncelleştirip üretim sunucusuna kopyaladım, dosya kullanımda olduğundan bunu yapamıyorum. Orada sürpriz yok. Peki çözüm nedir?

    İdeal olarak, bir dosya kullanım hatası olmadan ve server.exe yeniden başlatılmadan, güncelleştirilmiş bir feedProcessors.dll üretim sunucusuna kopyalamak mümkün olmak istiyorum. Sonra, bir sonraki sefer server.exe FeedProcessorUtils.CreateFeedProcessor() için bir çağrı yapar, eski yerine yerine revize DLL yürütüyor olacak.

    Nereden başlarım?

  • +1

    [MEF] adlı kullanıcıyı arıyorsunuz (http://msdn.microsoft.com/en-us/library/dd460648 (v = vs.110) .aspx) –

    cevap

    3
    +0

    İlginç. Teşekkürler. Diyelim ki derlememi dinamik olarak yüklemek için Assembly.Load (byte []) kullanıyorum. Ben yükledikten sonra diğer SO gönderilerinden toparlandım, benim durumumda çalışılamaz olan tüm AppDomain'i öldürmeden onu kaldıramıyorum. Yani eğer programım, "feedProcessor.dll" öğesinin, Assembly.Load() 'a ** müteakip ** çağrıları yapabileceğimi belirlediğini belirler mi? Önceden yüklenmiş sürüm hakkında ne yapmalıyım? Referansı boşverir miyim? Dispose() işlevi yok. Bellek sızıntısı mı oluşturacağım? –

    İlgili konular