2012-08-28 6 views
5

Sto lavorando a un progetto DotNet, che include una DLL. Questa DLL utilizza un .lib (codice C). Sfortunatamente, ci sono molte variabili statiche in questo .lib. Il problema che ho qui:DotNet: variabili statiche nella DLL

Se due utenti eseguono una ricerca allo stesso tempo, visualizzo un errore, perché entrambi accedono a .lib, uno cambia qualcosa mentre altri tenta di leggere i dati.

La soluzione ovvia, sarebbe quella di bloccare l'accesso, ma io davvero non voglio farlo, perché questo rallenta drasticamente il processo di ricerca. Preferirei provare a creare una DLL dalla lib, ma non so se questo risolverà il problema, in quanto non so se le variabili statiche verranno quindi memorizzate separatamente, o se entrambi i processi di ricerca accederanno allo stesso variabili.

Qualcuno ha esperienza con questo? Perché ci vorrà un bel pò di tempo per farlo, e mi piacerebbe sapere se funziona prima di iniziare a farlo.

Spero che tutto sia comprensibile, in quanto l'inglese non è la mia prima lingua e le mie capacità di programmazione sono piuttosto elementari.

+0

Si * dovrebbe * evitare l'uso eccessivo di campi * statici *. Prova a cambiare * Tipo * design. – adatapost

+1

Il problema è che il codice C è pieno di statiche, ci vorrebbe troppo tempo per cambiare tutto. L'unica alternativa veloce che vedo, sta provando questo "trucco" della DLL. – Stefan

+0

@Stefan: definisce un nuovo tipo in un nuovo assembly che ha accesso a quel codice C (e solo a esso), in altre parole un wrapper per esso. Adn da quel tipo, gestisci l'accesso esclusivo alle risorse C nel modo desiderato. Quindi, se vuoi chiamare qualche funzione C, devi usare quel tipo, e se chiamerai qualcosa nella parte centrale dell'esecuzione, lo stesso tipo ti bloccherà, genererà un'eccezione, mostrerà un messaggio .. qualunque sia. – Tigran

risposta

1

Da quello che ho capito, non c'è modo di poter modificare i dati in modo simulatuoso mentre si sta leggendo da esso utilizzando le classi esistenti all'interno di questo dll. Chiaramente questo non funzionerà, non importa che roba di fantasia tu stia facendo.

Quello che potresti fare è creare un Thunking Layer. Questo sarà un tipo di classe wrapper che verrà chiamata al posto di .dll. Questa classe gestirà le richieste di I/O simultanee conservando una copia locale dei dati per le letture e consentendo modifiche furbe ai dati reali, aggiornando la copia locale al termine di queste manipolazioni (con il blocco temporaneo appropriato, ecc.). Potrebbero esserci altri modi standard di fare ciò di cui non sono a conoscenza, ma è così che vorrei iniziare.

Spero che questo aiuti.

+0

L'idea sarebbe che ogni utente abbia la sua versione della DLL in esecuzione. Ora il problema è che non so se in Dot Net, le variabili statiche saranno condivise tra gli utenti, oppure no. Ma grazie per il link, lo esaminerò, sembra interessante! – Stefan

+1

@Stefan Le variabili statiche in '.NET Framework' sono condivise tra tutti gli utenti dell'applicazione di cui fanno parte queste variabili. Se farai 1 livello extra per esporre questi dati, potrebbe essere d'aiuto ma non ne sono sicuro. – harry180