2012-08-28 20 views
5

Ich arbeite an einem Dot Net-Projekt, das eine DLL enthält. Diese DLL verwendet eine .lib (C-Code). Leider gibt es in dieser .lib viele statische Variablen. Das Problem habe ich hier:DotNet: Statische Variablen in DLL

Wenn zwei Benutzer gleichzeitig eine Suche durchführen, erhalte ich einen Fehler, da beide auf die .lib zugreifen, man ändert etwas während man versucht andere Daten zu lesen.

Die offensichtliche Lösung wäre, den Zugriff zu sperren, aber das möchte ich wirklich nicht, weil das den Suchprozess drastisch verlangsamt. Ich würde lieber versuchen, eine DLL aus der lib zu machen, aber ich weiß nicht, ob dies das Problem lösen würde, da ich nicht weiß, ob die statischen Variablen dann getrennt gespeichert werden oder ob beide Suchprozesse auf dasselbe zugreifen Variablen.

Hat jemand Erfahrung damit? Weil es ziemlich lange dauern wird, und ich würde gerne wissen, ob es funktioniert, bevor ich damit anfange.

Ich hoffe alles ist verständlich, da Englisch nicht meine Muttersprache ist, und meine Programmierkenntnisse sind ziemlich einfach.

+0

Sie * sollten * übermäßige Verwendung von * statischen * Feldern vermeiden. Versuchen Sie, * Type * Design zu ändern. – adatapost

+1

Das Problem ist, dass der C-Code voller Statik ist, es würde viel zu lange dauern, alles zu ändern. Die einzige schnelle Alternative, die ich atm sehe, ist diese DLL "Trick" zu versuchen. – Stefan

+0

@Stefan: Definiere einen neuen Typ in einer neuen Assembly, die Zugriff auf diesen C-Code (und nur diesen) hat, also einen Wrapper dafür. Adn von diesem Typ, verwalten Sie exklusiven Zugriff auf C-Ressourcen in der gewünschten Weise. Wenn Sie also eine C-Funktion aufrufen wollen, müssen Sie diesen Typ verwenden, und wenn Sie etwas mitten in der Ausführung aufrufen, wird derselbe Typ Sie blockieren, eine Ausnahme auslösen, eine Nachricht anzeigen ... was auch immer. – Tigran

Antwort

1

Von dem, was ich verstehe, gibt es keine Möglichkeit, die Daten simultan zu bearbeiten, während Sie aus den vorhandenen Klassen innerhalb dieser .dll lesen. Klar, das wird einfach nicht funktionieren, egal was für schicke Sachen du tust.

Was Sie tun könnten, ist ein Thunking Layer erstellen. Dies ist eine Art Wrapper-Klasse, die anstelle der DLL aufgerufen wird. Diese Klasse behandelt gleichzeitige E/A-Anforderungen, indem sie eine lokale Kopie der Daten für Lesevorgänge bereithält und komplizierte Änderungen an den echten Daten zulässt, wobei die lokale Kopie aktualisiert wird, wenn diese Bearbeitungen beendet sind (mit entsprechenden temporären Sperren usw.). Es mag andere Standardmethoden geben, die ich nicht kenne, aber so würde ich beginnen.

Ich hoffe, das hilft.

+0

Die Idee wäre, dass jeder Benutzer seine eigene Version der DLL laufen hat. Jetzt ist das Problem, ich weiß nicht, ob in Dot Net die statischen Variablen unter den Benutzern geteilt werden oder nicht. Aber danke für den Link, ich schaue mal rein, klingt interessant! – Stefan

+1

@Stefan statische Variablen in '.NET Framework' werden von allen Benutzern der Anwendung geteilt, zu denen diese Variablen gehören. Wenn Sie eine zusätzliche Ebene erstellen, um diese Daten verfügbar zu machen, kann es hilfreich sein, aber ich bin mir nicht sicher. – harry180