2012-10-30 17 views
5

Mam zdarzenie, które działa poprawnie podczas działania w trybie testowym, ale nie uruchamia się po uruchomieniu kodu jako usługi. Zanim opublikuję kod, pozwól mi podać trochę struktury dla aplikacji, ponieważ uważam, że jest to przyczyna problemu.Zdarzenie nie uruchomione podczas pracy jako usługa

Mam aplikację do obsługi tacy, która służy do kontrolowania usługi routera. Po uruchomieniu usługa ładuje bibliotekę DLL, w której odbywa się całe przetwarzanie. Po uruchomieniu biblioteki skanuje katalog pod kątem wtyczek i łączy je z programem głównym.

Po utworzeniu w wersji Release usługa jest aktywna i muszę zainstalować aplikację. Na marginesie aplikacja taca jest uruchamiana jako administrator, dzięki czemu może kontrolować usługę. Podczas budowania jako debugowania, zasobnik uruchamia bibliotekę DLL bezpośrednio, pomijając małą aplikację usługową, która ją uruchamia. Patrz poniższy schemat:

enter image description here

W każdym przypadku, przepływ dla tej wtyczki jest odbiornik odbiera plik i zawiadamia nadawcę do przekazania go przez zdarzenie. Plik jest wysyłany do zdalnego przetwarzania, a następnie zwracany do innego odbiorcy, który przekazuje wyniki do wtyczki za pośrednictwem zdarzenia. Wtyczka następnie przetwarza plik i powinna wysłać go z powrotem do głównego programu w Wydarzeniu. Podczas uruchamiania w trybie debugowania (bez usługi), dokładnie tak się dzieje. Działając jako usługa, obsługa wszystkich zdarzeń działa doskonale, z wyjątkiem wtyczki powiadamiającej program główny, że wyniki zostały przetworzone. Nie zgłoszono żadnych wyjątków i potwierdziłem poprzez rejestrację, że wydarzenie zostało poprawnie połączone.

Podłączanie wydarzenia:

// Connect delegate to plugins that will add data to the database through the Router 
if (plugin is INotify) 
{ 
    ((INotify)plugin).NotifyProcessingComplete += new ProcessNotification(this.OnProcessed); 
    LogWriter.Log("Associated " + plugin.Name + " with OnProcessed", LogFile); 
} 

Wywołanie zdarzenia z wtyczki:

if (NotifyProcessingComplete != null) 
    NotifyProcessingComplete(ExtractResults(args.ReceivedFile)); 
else 
    LogWriter.Log("NotifyProcessingComplete Delegate was null.", LogFile); 

Event Handler:

public void OnProcessed(ProcessArgs args) 
{ 
    LogWriter.Log("On Dicom Process was called...", LogFile); 
    lock (threadLock) 
    { 
     if (Settings != null) 
     { ... } 
    } 
} 

Według dzienników, wtyczka jest podłączona prawidłowo do OnProcessed, a logowanie metody ExtractResults() pokazuje, że powraca poprawnie. Jednak NotifyProcessingComplete nie wywołuje metody OnProcessed.

Po raz kolejny dzieje się to tylko podczas uruchamiania kodu jako usługi. Podejrzewam, że może to mieć coś wspólnego z tacą działającą jako administrator, usługą działającą jako Lokalny system i wtyczką ładowaną dynamicznie.

Poniżej mam włączone mój kod do ładowania wtyczki, w przypadku może pomóc:

private void loadPlugins() 
{ 
    String pluginPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 

    // Create a domain to text for plugins 
    AppDomain domain = AppDomain.CreateDomain("PluginLoader"); 

    PluginFinder finder = (PluginFinder)domain.CreateInstanceAndUnwrap(
     typeof(PluginFinder).Assembly.FullName, typeof(PluginFinder).FullName); 
    finder.LogFile = logFile; 

    // Get valid plugins, and then unload the domain to clear up memory 
    List<String> FoundPluginTypes = finder.SearchPath(pluginPath); 
    AppDomain.Unload(domain); 

    // Load the plugins 
    Plugins = new List<IPlugin>(); 
    foreach (String plugin in FoundPluginTypes) 
    { 
     Assembly assembly = Assembly.LoadFrom(plugin); 
     Type type = null; 

     foreach (Type t in assembly.GetTypes()) 
      if (t.GetInterface("IPlugin") != null) 
       type = t; 

     try 
     { 
      IPlugin loader = (IPlugin)Activator.CreateInstance(type); 
      Plugins.Add(loader); 
     } 
     catch (NullReferenceException e) 
     { 
      LogWriter.Log("Could not load plugin.", e, LogFile); 
     } 
    } 
} 

Każda pomoc lub sugestie będą bardzo mile widziane. Z góry dziękuję.

+1

Spróbuj zbadać funkcję ExtractResults, wydaje się, że coś idzie nie tak ... – Dusan

+0

@Dusan - Dziękuję za komentarz. Wypełniłem metodę logami i wiem, że wszystko działa zgodnie z oczekiwaniami aż do powrotu. Zbadałem również obiekt, który powracał, który został stworzony tak, jak powinien. Jednak, aby być absolutnie pozytywnym, właśnie wysłałem nowy obiekt, zamiast uzyskać go z metody, co spowodowało nieoczekiwane błędy. Od tego momentu udało mi się wyśledzić błąd dotyczący problemu logowania SQL w metodzie OnProcessed. Jeszcze raz dziękuję za sugestię.Jeśli utworzysz odpowiedź, chętnie udzielę ci kredytu. – Tim

+0

Brzmi jak problem z uprawnieniami, czy możesz spróbować zmienić konto użytkownika używane przez usługę i sprawdzić, czy to działa? –

Odpowiedz

0

Czy można sprawdzić, czy obiekty odbiornika/nadawcy nie mają GCed? Może tak być, ponieważ twój wzorzec inicjalizacji do wydania i debugowania jest inny

Powiązane problemy