Quindi sto scrivendo un wrapper gestito da C # attorno a una dll nativa. La DLL contiene diverse centinaia di funzioni. Nella maggior parte dei casi, il primo argomento per ogni funzione è un handle opaco per un tipo interno alla dll.
Quindi, un ovvio punto di partenza per la definizione di alcune classi nel wrapper sarebbe la definizione di classi corrispondenti a ciascuno di questi tipi opachi, con ogni istanza contenente e gestendo l'handle opaco (passato al suo costruttore)
Le cose sono un po 'scomode quando si tratta di callback dalla DLL. Naturalmente, i gestori di callback nel mio wrapper devono essere statici, ma gli argomenti callbacks invariabili contengono un handle opaco.
Per tornare dal richiamo statico a un'istanza dell'oggetto, ho creato un dizionario statico in ogni classe, associando gli handle con le istanze di classe. Nel costruttore di ogni classe, una voce viene inserita nel dizionario e questa voce viene quindi rimossa nei Distruttori. Quando ricevo una richiamata, posso quindi consultare il dizionario per recuperare l'istanza della classe corrispondente al riferimento opaco.
Ci sono evidenti difetti in questo? Qualcosa che sembra essere un problema è che l'esistenza del dizionario statico significa che il garbage collector non agirà sulle mie istanze di classe che sono altrimenti irraggiungibili. Poiché non vengono mai raccolti, non vengono mai rimossi dal dizionario, quindi il dizionario cresce. Sembra che potrei dover disporre manualmente dei miei oggetti, che è assolutamente qualcosa da evitare.
Qualcuno può suggerire un buon design che mi permetta di evitare di doverlo fare?