Nicht Thread-safe fähige dll in COM Server einbauen

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von DotNetler.

    Nicht Thread-safe fähige dll in COM Server einbauen

    Hallo,

    ich bin relativ neu im Geschäft und habe folgendes Problem:

    Ich habe eine nicht Threadsichere DLL, über die ich mit einer Maschine kommunizieren muss. Leider benötige ich mehrere Threads in meinem Prog, die eigentlich diese Schnittstette benutzen müssen. Nun habe ich vom Hersteller die Info erhalte, ich sollte in dem Fall mir einfach (haha, ich lache) einen dll Server bauen, über den die ganze Kommunikation läuft. Hiervon habe ich leider gar keine Ahnung. Ich habe vom Hersteller nur die DLL und in Beispielcode mit einem Thread. Wie mache ich jetzt so einen Server?

    Danke

    Dotnetler
    Wo kommt jetzt COM ins Spiel ? Davon sehe ich zunächst garnichts.

    Threads die auf COM Objekte zugreifen sollte man möglichst als SingleApartment anlegen, da COM Objekte nur darauf ausgerichtet sind: thread.SetApartmentState(ApartmentState.STA)

    Dürfen die Threads nicht simultan auf die Schnittstelle zugreifen , so musst Du diese synchronisieren:
    - über Synclock synchronisationsObject
    - oder einen Mutex oder Monitor oder WaitHandle
    Schreib dir eine MessageLoop, die von einem Thread abgearbeitet wird. Diese Loop bietet dann (wie System.Windows.Forms.Control) eine Invoke-Methode, die alle Aufrufe (egal aus welchem Thread) zur MessageLoop marshallt. Der Aufruf wird dann vom Loop-Thread ausgeführt, sodass du deine DLL wie eine Form "Invoken" kannst.

    Im MSDN werden MessageLoops über API-Calls realisiert. Das geht aber auch verwaltet - nur musst du dann selbst synchronisieren. Lies alle Teile von diesem Artikel: codeproject.com/Articles/31971…hronizationContext-Part-I. Dort wird ein eigener Synchronisationskontext implementiert - genau das, was du brauchst.

    Wenns nicht ganz so kompliziert sein soll, reicht auch folgendes (ist aber unflexibel und nicht universell wiederverwendbar):

    VB.NET-Quellcode

    1. Class DllWrapper
    2. Private Shared oLock As New Object()
    3. Public Shared Sub DllMethod1()
    4. SyncLock oLock
    5. MyDll.DllMethod1()
    6. End SyncLock
    7. End Sub
    8. 'alle verwendeten DLL-Methoden nach demselben Muster implementieren, immer mit SyncLock oLock.
    9. End Class

    Edit: Es muss Public Shared Sub heißen.
    Gruß
    hal2000

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hal2000“ ()