2014-05-01 17 views
13

Dato un caricato Assembly c'è un modo (nel codice) per determinare quale dei 3 contesti di carico è stato caricato in (default carico, LoadFrom, o )?Determinare il contesto carico di un assieme

Nell'articolo Suzanne Cook's "Choosing a Binding Context", ci sono alcuni svantaggi che si verificano quando un assembly viene caricato nel LoadFrom. In particolare, la mia libreria utilizza la deserializzazione e incontra un InvalidCastException quando viene caricato nel contesto LoadFrom.

Attualmente la mia libreria non riesce molto tardi (non riesce quando esegue il codice di deserializzazione problematico - vedere my example). Mi piacerebbe farlo fallire molto prima in queste circostanze rilevando il contesto in cui è stato caricato e generando un'eccezione se non è stato caricato nel contesto predefinito Load.

+0

Una soluzione IMO (non molto elegante) potrebbe essere la sottoclasse di Assemblaggio, riscrivere i metodi di caricamento e aggiungere contrassegni personalizzati quando viene utilizzato uno dei metodi. – pasty

+1

@pasty Il metodo Load utilizzato non determina necessariamente il caricamento dell'assembly in un particolare contesto. Cioè Chiamare Assembly.Load non causa sempre il caricamento dell'assembly nel contesto di caricamento predefinito. Inoltre, non ho il controllo del codice che carica l'assembly. –

+0

Hai testato il comportamento della proprietà 'Assembly.HostContext'? È del tipo "lungo". Ho sbirciato in quella proprietà usando JustDecompile, ma non ho ancora idea di come possa il suo valore mappare a quelle 3 categorie. –

risposta

3

Invece di identificare il contesto dell'assieme, è possibile verificarne il comportamento. Ad esempio, per la serializzazione, il serializzatore chiamerà Assembly.Load e tale assembly deve corrispondere a corrispondendo allo all'assembly dell'oggetto serializzato. Una partita può essere testata controllando il CodeBase.

private static bool DoesAssemblyMatchLoad(Assembly assemblyToTest) 
{ 
    try 
    { 
     var loadedAssembly = Assembly.Load(assemblyToTest.FullName); 
     return assemblyToTest.CodeBase == loadedAssembly.CodeBase; 
    } 
    catch (FileNotFoundException) 
    { 
     return false; 
    } 
} 
+0

Sembra funzionare per tutti i casi che ho provato (Load, LoadFrom e LoadFile). Ha la bella caratteristica che caricherà solo un nuovo assembly nel caso in cui non ci sia una corrispondenza. Sebbene tecnicamente non risponda alla domanda, risolve il mio problema in modo soddisfacente. –

Problemi correlati