2015-01-30 17 views
54

Ho una libreria con all'interno un campo statico. Voglio creare un'app e fare riferimento a questa libreria in modo da avere due istanze di questo campo statico. .Net runtime non consente di fare riferimento alla stessa libreria due volte, ma mi chiedo se è possibile superare questa limitazione?Il contesto statico è sempre singolo in C#?

Non sono autorizzato a modificare la libreria, ma è possibile copiarla/rinominarla.

risposta

84

Non è pazzesco come pensi. In realtà, è possibile ottenere questo utilizzando AppDomains.

Ogni AppDomain dispone di una posizione di archiviazione per variabili statiche. Quindi puoi semplicemente creare un secondo AppDomain nel tuo processo e comunicare tra loro utilizzando un oggetto che eredita da MarshalByRefObject come in this MSDN example.

+3

Mi è piaciuta la tua risposta, potresti fornirci qualche dolce LoC :) –

+0

@Jeremy il [link MSDN] (https://msdn.microsoft.com/en-us/library/system.appdomain.aspx) dal mio la risposta ha un esempio di comunicazione cross-app completo tra domini che utilizzano i proxy. –

+3

Questo potrebbe non essere * pazzesco *, ma sicuramente suona un po '"avviso di cattiva architettura" per me. – Falanwe

57

Mentre Lucas' suggestion su AppDomains funzionava, in alternativa è possibile creare questo effetto utilizzando i generici, in quanto una classe con argomenti di tipo generico diverso viene trattata come una classe diversa e pertanto ha i propri campi statici.

public class SomeClass<T> 
{ 
    public static string SomeField; 
} 

Poi:

SomeClass<int>.SomeField = "A"; 
SomeClass<string>.SomeField = "B"; 

Console.WriteLine(SomeClass<int>.SomeField); // A 
Console.WriteLine(SomeClass<string>.SomeField); // B 

Ad esempio, il SomeClass<int> sarebbe impostato nella biblioteca, mentre il SomeClass<string> sarebbe la vostra copia. Ovviamente, ciò funzionerebbe solo se fosse possibile cambiare la libreria o la libreria avesse già utilizzato i generici.

+49

Questo è uno dei più begli e orribili abusi di farmaci generici che abbia mai visto. –

+2

@BradleyUffner attendi fino a quando non vedi i singleton CRTP in C++ – immibis

+3

Sì, ma quelli sono campi diversi, non due istanze dello stesso campo statico. –

1

Entrambi i suggerimenti dovrebbero funzionare, ma sono tutti fantastici per quanto riguarda l'architettura.

Non sono a conoscenza del contesto, ma nel tuo caso è possibile creare solo una classe di aggregazione con una nuova proprietà che non sia statica e abbia solo due istanze. Questo suona come un modo migliore per me.

Ogni volta che ho un codice intelligente, un allarme inizia nella mia testa. Il codice smart è sempre troppo intelligente per uno sviluppatore.

+1

Sono completamente consapevole delle conseguenze di questo. Stavo spiegando che all'inizio della domanda, ma il moderatore ha rimosso questa parte a causa dell'offesa. Ho una libreria di terze parti che non sono in grado di modificare e che ha la funzionalità di cui ho bisogno due volte, ma è statica, quindi posso usarla solo una volta. Ho chiesto al creatore della biblioteca su questo, e la sua risposta è stata quella di provare a usare gli hack perché è troppo difficile da ridisegnare. L'approccio con avere due domini ha funzionato bene, e sembra abbastanza facile e adatto (eccetto che devi gestire tutta la vita), quindi sono d'accordo. – Archeg

+0

Ma hai ragione - è importante individuare che non dovresti seguire questo approccio a meno che tu non debba davvero – Archeg

Problemi correlati