Domanda

Sto sviluppando un'applicazione .net che dipende fortemente dai plugin. L'applicazione stessa contiene una connessione a un server remoto.

Recentemente ho scavato nei domini dell'applicazione e li vedo come la soluzione ideale per isolare il codice del plugin dal resto dell'applicazione.

Tuttavia, c'è un grosso svantaggio che mi rende incapace di implementare i domini delle applicazioni per l'hosting dei plugin. Sembra che non ci sia modo di passare un oggetto facendo riferimento a un altro dominio dell'applicazione necessario per passare un riferimento all'oggetto connessione.

Speravo che qualcuno potesse darmi una soluzione alternativa in modo da poter passare un riferimento a quell'oggetto.

Nota: la creazione di un proxy è fuori discussione, il livello di connessione funge già da proxy poiché le classi vengono generate automaticamente.

Nota2: System.AddIn non può essere utilizzato in quanto non è disponibile nel framework compatto.

È stato utile?

Soluzione

Hai provato a derivare da MarshalByRefObject ? È un dolore in quanto rovina la tua gerarchia ereditaria, ma penso che sia quello che vuoi.

Dai documenti:

  

MarshalByRefObject è la classe base   per oggetti che comunicano attraverso   confini del dominio dell'applicazione per   scambiare messaggi usando un proxy.   Oggetti che non ereditano   MarshalByRefObject è implicitamente   maresciallo per valore. Quando un telecomando   l'applicazione fa riferimento a un maresciallo di   valore oggetto, una copia dell'oggetto è   passato attraverso il dominio dell'applicazione   confini.

     

Gli oggetti MarshalByRefObject sono   accessibile direttamente dal   confini dell'applicazione locale   dominio. La prima volta un'applicazione   in un dominio di applicazione remoto   accede a un MarshalByRefObject, un proxy   viene passato all'applicazione remota.   Le chiamate successive sul proxy sono   ritornò all'oggetto residente   nel dominio dell'applicazione locale.

     

I tipi devono ereditare da   MarshalByRefObject quando il tipo è   utilizzato nel dominio dell'applicazione   confini e lo stato del   l'oggetto non deve essere copiato perché il file   i membri dell'oggetto non sono utilizzabili   all'esterno del dominio dell'applicazione dove   sono stati creati.

Nella mia esperienza, può essere piuttosto limitante: devi davvero fare il meno possibile oltre il limite di AppDomain, preferibilmente limitandoti alle operazioni che richiedono solo tipi, stringhe e array primitivi di entrambi. Ciò potrebbe essere dovuto alla mia inesperienza nel lavorare con più AppDomain, ma è solo un avvertimento che è un po 'un campo minato.

Altri suggerimenti

Per parlare con la stessa istanza tra AppDomains, è necessario ereditare da MarshalByRefObject . Fatto in questo modo, ogni chiamata di metodo all'oggetto (incluse proprietà ecc.) È in realtà una chiamata remota all'altro dominio di app. Questo aiuta?

Tieni presente che la pulizia dei proxy MarshalByRefObject viene ripulita in base a un contratto di locazione. In breve, se non si utilizza l'oggetto per un tempo specifico, verrà recuperato. Puoi controllarlo sovrascrivendo InitializeLifetimeService per restituire un oggetto di leasing che soddisfa le tue esigenze. Se si restituisce null si disabilita effettivamente il leasing e quindi l'oggetto viene recuperato solo quando AppDomain viene scaricato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top