2012-01-14 6 views
5

Ho un requisito per il caricamento di assembly di versioni diverse (ho già l'assembly con lo stesso nome nella mia applicazione).Utilizzare l'oggetto classe tra diverse versioni dello stesso assembly utilizzando Reflection

Sono stato in grado di caricare l'assembly e caricare il metodo che ho bisogno di invocare usando reflection ma quando vado a invocare il metodo passando il mio oggetto di classe come argomento, ho ottenuto l'eccezione che l'oggetto di classe non può essere convertito nel tipo del parametro argomento.

Codice di esempio -

Assembly myAssembly = Assembly.LoadFrom("Assembly Path for assembly with different version"); 
object classObject = myAssembly.CreateInstance("ClassName"); 
Type classType = myAssembly.GetType("ClassName"); 
MethodInfo myMethod = classType.GetMethod("MyMethod", BindingFlags.Instance); 

// Creating an object of class in the latest assembly and need to pass this 
// to method in assembly with different version. 
ClassInBothVesions parameter = new ClassInBothVesions(); 

myMethod.Invoke(classObject, new object[] { parameter }); 

Qui parametro è un oggetto di una classe che ho in assemblea ma dato classe parametro viene creato nel montaggio della versione attuale. E quando provo a passarlo al metodo dell'assemblaggio precedente, ho ottenuto un'eccezione che non può essere convertito.

Come posso ottenere questo? Fatemi sapere se ho bisogno di ulteriori informazioni qui. Grazie in anticipo.

+0

Potrei sbagliarmi, ma per quanto ho capito, il caricamento di una versione diversa di un assembly richiede un altro dominio dell'app. Altrimenti, verrà utilizzata la versione già caricata. – Vlad

+0

No, sono riuscito a caricare l'assembly nello stesso dominio dell'app. L'unico problema si presenta quando provo a passare il parametro creato in una versione ad un'altra. Se provo a invocare il metodo con oggetto creato nella stessa versione utilizzando il reflection, funziona bene .. –

+0

possibile duplicato di [Passare oggetti di classe attraverso diverse versioni di assembly] (http://stackoverflow.com/questions/8871079/passing-class -objects-across-different-assembly-versions) –

risposta

2

È necessario controllare il quadro di estensibilità gestita (MEF). Rende ciò che vuoi fare molto più facilmente e ti allontana dal doverti preoccupare di AppDomain e di diversi assembly.

Edit:

Se si desidera utilizzare riflessione solo per raggiungere ciò che si vuole, è necessario procurarsi un modello di oggetti flessibile all'interno dell'applicazione. Le basi di questo approccio sono ciò che MEF fa sotto il cofano. Dove si ottiene veramente il potere di fare questo è da .Net remoting, quindi suggerirei di leggere su questo.

Che cosa hai bisogno:

  • l'applicazione in (montaggio A).

  • Assemblaggio con codice vecchia classe (assemblea C).

  • Una classe Remote Loader che fungerà da proxy/remoto per il secondo AppDomain.

  • Una classe proxy che rappresenterà un'istanza della vecchia versione di una classe.

  • Assembly B che conterrà la classe proxy e il caricatore remoto.

Ecco cosa si potrebbe provare: applicazione

  1. carico dal gruppo A.

  2. Creare nuova istanza AppDomain.

  3. istanziare un'istanza della classe "Loader remoto" nel nuovo AppDomain dal gruppo B.

    a. Ciò causerà il caricamento dell'assembly B nell'AppDomain.

  4. Dal "Remote Loader", caricare l'assembly C e creare un'istanza della classe precedente quindi trasferire un'istanza della classe proxy all'appDomain originale.

  5. Ora speriamo che possiate modificare i vostri metodi per accettare una versione più generica dell'oggetto (possibilmente un'interfaccia?) Che il proxy e la vostra nuova versione di classe possono implementare entrambi.

+0

+1 .. Grazie, esamineremo questo .. Ma non posso integrarlo con la mia applicazione adesso. C'è una via d'uscita usando la riflessione .. ?? –

+0

L'ho aggiornato con un metodo di sola riflessione, anche se ti suggerirei di ripensare davvero a ciò che stai cercando di ottenere in quanto è più o meno un trucco troppo complicato. – doogle

Problemi correlati