Marek Z.

Marek Z. Programista

Temat: Korzystanie z DLL ki w Windows Service

Hej, pytanie zadałem już na dP link z braku odpowiedzi postanowiłem spróbować tu.

Rzecz ma się następujaco: Jest serwis windowsowy nazwijmy go Event.Service, w którym korzystam ze stworzonej DLL ki zawierającej kontrakty (DataContracts) do komunikacji z serwisem WCF. Teraz w momencie uruchomienia Event.Service w trybie debug w Visual Studio to w miejscu gdzie wywołuję metodę, która korzysta z obiektów tej DLL ki serwis się tak jakby zawiesza. Jeśli usunę z tej metody fragment korzystający z obiektu DLL ki serwis działa normalnie. Poniżej fragment kodu:

Event.Service (plik MainService.cs):

private void timerMain_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timerMain.Stop();

// Na tej metodzie serwis się "zawiesza"
_handler.ProcessMessages();

timerMain.Start();
}

Event.Service (metoda ProcessMessages()):

public void ProcessMessages()
{
if (!EventExists())
return;

// Tutaj utworzenie obiektu z zewnętrznej DLL ki
Service.DataContracts.SmsMessage message = new Service.DataContracts.SmsMessage();
}

Klasa SmsMessage to zwykła klasa opatrzona atrybutami DataContract oraz DataMember:

[DataContract]
public class SmsMessage
{
[DataMember]
public string Recipient { get; set; }

[DataMember]
public string PhoneNumber { get; set; }
}


DLL ka była kompilowana w różnych trybach (Release, Debug, x86, x64), jest również w katalogu bin serwisu.

Ma ktoś pomysł dlaczego tak się dzieje ?

Po dodaniu projektu DLL ki do solucji i dodaniu referencji bezpośrednio z projektu też to samo.Marek Z. edytował(a) ten post dnia 22.01.13 o godzinie 08:49
Paweł Paluch

Paweł Paluch Software Developer

Temat: Korzystanie z DLL ki w Windows Service

Jeżeli dobrze rozumiem to zawiesza się wewnątrz metody ProcessService() na utworzeniu obiektu SmsMessage?
Możesz dokładniej opisać "serwis się tak jakby zawiesza"? Czy wyrzuca jakiś wyjątek?

Z tego co napisałeś wnioskuję że uruchomiłeś usługę z podpiętym Debuggerem?
Marcin S.

Marcin S. Programista, trener
i konsultant w
zakresie .NET/.NET
Cor...

Temat: Korzystanie z DLL ki w Windows Service

Zacznij od diagnostyki. Sprawdź czy wchodzi do ProcessMessages i co robi dalej.
Podłącz się zdalnie debugerem lub skorzystaj z logowania (polecam np. nlog).
Marek Z.

Marek Z. Programista

Temat: Korzystanie z DLL ki w Windows Service

Zawiesza się przy próbie wejścia do metody ProcessMessages(). Zawieszanie to może niezbyt trafne określenie, wyglada to tak, że ustawiam breakpointa na timerMain.Stop i jak próbuję wejść do metody ProcessMessages() to debugger staje i nic się nie dzieje. Wszystkie informacje z Locals znikaja i stoi. Tak jakby chciał wejść do środka, ale nie może - dlatego napisałem "zawiesza" bo staje w tym miejscu i nic, żadnego wyjatku, okna Locals, Watch i CallStack sa puste.

Jeśli z wnętrzna metody ProcessMessages() usunę linię odpowiedzialna za tworzenie obiektu z dll ki debugger wchodzi normalnie...Marek Z. edytował(a) ten post dnia 22.01.13 o godzinie 14:28
Paweł Paluch

Paweł Paluch Software Developer

Temat: Korzystanie z DLL ki w Windows Service

Przyznam, że dotychczas nie spotkałem się z takim problemem, więc idę trochę na ślepo, spróbuj dodać publiczny konstruktor do SmsMessage ( pusty byle był) i ustawić breakpointy na wejściu/wyjściu z konstruktora, przed i po utworzeniu obiektu w ProcessMessage().

BTW: w projekcie w którym korzystasz z problematycznej dll, masz referencję do System.Runtime.Serialization?
Marek Z.

Marek Z. Programista

Temat: Korzystanie z DLL ki w Windows Service

Wszystkie referencje mam dodane, spróbowałem z tym konstruktorem i breakpointami jak mówiłeś i to samo. W ogóle nie wchodzi do ProcessMessages(), nawet jak ustawię breakpointa w EventHandler na:

* public void ProcessMessages()
{
....
}

gwiazdka to breakpoint to nawet tam się nie zatrzyma (nie dochodzi do tego punktu).

Dla mnie też to jest nowość. Dodam, że w zwykłym projekcie (Windows Forms, ASP.NET) z DLL-ki można korzystać normalnie. Problem występuje tylko w Windows Service...Marek Z. edytował(a) ten post dnia 23.01.13 o godzinie 09:15
Tomasz M.

Tomasz M. never go full
retard!

Temat: Korzystanie z DLL ki w Windows Service

Takie pytanie od czapy, widzę tam jakiś timer. Nie masz jakiegośmechanizmu stopującego wątek np. główny? Wyjaśniałoby dlaczego debugger "staje" ;)

A jeśli to WinService, to może po prostu w pewnym momencie usługa się zatrzymuje z jakiegoś powodu? Przeglądałęś event loga? Może tam coś widnieje?Tomasz M. edytował(a) ten post dnia 23.01.13 o godzinie 09:53
Marek Z.

Marek Z. Programista

Temat: Korzystanie z DLL ki w Windows Service

Tomasz M.:
Takie pytanie od czapy, widzę tam jakiś timer. Nie masz jakiegośmechanizmu stopującego wątek np. główny? Wyjaśniałoby dlaczego debugger "staje" ;)

Ej aż tak blady nie jestem :] nie ma żadnego mechanizmu tam, jak pisałem wyżej, gdy usunę linię

Service.DataContracts.SmsMessage message = new Service.DataContracts.SmsMessage();

z metody ProcessMessages() debugger wchodzi, więc nic nie blokuje watku.
Ba sama inicjacja

Service.DataContracts.SmsMessage message;

zawiesza serwis...

Event log jest czystyMarek Z. edytował(a) ten post dnia 23.01.13 o godzinie 10:51
Tomasz M.

Tomasz M. never go full
retard!

Temat: Korzystanie z DLL ki w Windows Service

Ehe, no to faktycznie kapa.

Pozostaje Ci http://www.ollydbg.de/ ;)
Karim Agha

Karim Agha Software Engineer

Temat: Korzystanie z DLL ki w Windows Service

Ustaw tracing na verbose, w web.config:


<configuration>
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="All"
propagateActivity="true">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "c:\log\Traces.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
</configuration>


I sproboj zreprodukowac crash, powinno zostac w logach.

(http://msdn.microsoft.com/en-us/library/ms733025.aspx)Karim Agha edytował(a) ten post dnia 23.01.13 o godzinie 11:22
Marek Z.

Marek Z. Programista

Temat: Korzystanie z DLL ki w Windows Service

Karim Agha:
Ustaw tracing na verbose, w web.config:

Niestety nic się nie zapisuje i to nie jest crash, tylko tak jakby zwiecha... pisałem wyżej.

W zwiazku z pytaniem na dP o przykład kodu, udostępniłem na codeplex fragment projektu do zbadania lokalnie, jak ktoś ma ochotę.

https://eventservice.codeplex.com/
Marcin Preś

Marcin Preś Informatyk,
Multitechnika S.C.

Temat: Korzystanie z DLL ki w Windows Service

SOA #1, .. tzn nie wiesza się, .. ale także nie wskakuje do tej metody.
Marek Z.

Marek Z. Programista

Temat: Korzystanie z DLL ki w Windows Service

Marcin Preś:
SOA #1, .. tzn nie wiesza się, .. ale także nie wskakuje do tej metody.

No właśnie, ma ktoś pomysł co może być przyczyną ? Debugowanie w jakiejkolwiek postaci nie przynosi skutku.
Paweł Paluch

Paweł Paluch Software Developer

Temat: Korzystanie z DLL ki w Windows Service

załadowałem Twój projekt i leci wyjątek:
"Could not load file or assembly 'Service.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format."

zmiana w Event.Service, Platform z Any CPU na x86 i śmiga
Marek Z.

Marek Z. Programista

Temat: Korzystanie z DLL ki w Windows Service

Dzięki za podpowiedź, ale to nie jest związane z moim problemem. Pomimo Twojej sugestii zmiana EventService na debug x86 nie zmienia faktu, że jak ustawiam breakpoint na

_handler.ProcessMessages();

i próbuje wejść (F11) do środka tej metody, debugger tak jakby się zatrzymuje i stoi - nie wchodzi tam.
Karim Agha

Karim Agha Software Engineer

Temat: Korzystanie z DLL ki w Windows Service

1. Zobacz w Parallel Stacks w Visual Studio albo jak uzywasz windbg to wpisz: ~*kd
i zobacz co sie dzieje na wszystkich watkach.

2. Ustaw breakpoint breakpoint na Main() i step-uj az sie "tak jakby zawiesi" i zobacz gdzie to sie dzieje.

Następna dyskusja:

Programowanie pod Windows V...




Wyślij zaproszenie do