2013-04-08 11 views
5

Sto tentando di caricare un assembly A in un nuovo AppDomain nella mia applicazione console con la stessa directory di base e RelativePath come dominio predefinito.CreateInstanceAndUnwrap non riesce a caricare l'assembly

Quando creo un tipo da A utilizzando CreateInstanceFrom, esso riesce ma quando uso CreateInstanceAndUnwrap non riesce a trovare il file di assembly con FileLoadException. Tieni presente che l'assembly A.MyType chiama un metodo dall'assemblaggio B.Typeb nel suo costruttore. Entrambi i file assemblee sono presenti nello stesso percorso nella cartella principale di eseguire il montaggio (.. \ Mytypes)

_domain = AppDomain.CreateDomain("MyDomain" + Guid.NewGuid(), null, AppDomain.CurrentDomain.SetupInformation); 
var mytype = _domain.CreateInstanceAndUnwrap(pathtoassembly, typename); 

Ecco il messaggio di errore:

Impossibile caricare il file o l'assembly' .. \ Mytypes \ A.dll 'o una delle sue dipendenze. Il nome dell'assembly o il codebase forniti non erano validi. (Eccezione da HRESULT: 0x80131047) `

+1

'CreateInstanceAndUnwrap' prende il nome dell'assembly come primo parametro, non il percorso dell'assieme. Inoltre, il percorso '.. \ MyTypes' si trova all'esterno della directory della base dell'applicazione e quindi non viene utilizzato durante la ricerca degli assembly. –

+0

Dovrai documentare la tua domanda con la traccia che ottieni da Fuslogvw.exe –

risposta

10

AppDomain.CreateInstanceAndUnwrap caricherà il montaggio nel contesto di carico mentre il AppDomain.CreateInstanceFromAndUnwrap caricherà il gruppo nel contesto LoadFrom.

La ragione per cui funziona con il metodo CreateInstanceFromAndUnwrap è che il contesto LoadFrom proverà a risolvere gli assembly nella cartella Mytypes. Il contesto di caricamento non lo farà. Proverà a risolvere solo dal GAC, dalla BaseDirectory e dal RelativeSearchPath dell'AppDomain.

Alcune delle opzioni che si hanno sono:

  1. utilizzare il contesto LoadFrom (utilizzando i metodi CreateInstanceFromXXX).
  2. Aggiungere la cartella Mytypes all'AppDomainSetup.PrivateBinPath utilizzato per creare l'AppDomain. In questo modo, il contesto di caricamento sarà in grado di risolvere i problemi che si trovano lì.
  3. Abbonarsi all'evento AppDomain.AssemblyResolve e risolvere autonomamente gli assiemi cercandoli e caricandoli dalla cartella Mytypes.
  4. Distribuire tutti gli assembly nella directory di base dell'applicazione.

Suggerisco l'opzione 2 che consentirà la struttura della cartella che si desidera più il contesto di caricamento che generalmente è la scelta preferita.

+0

Ho provato # 2 con CreateInstanceAndUnwrap e continuava a cercare nella directory di base dell'assembly in esecuzione come indicato nel log. Tuttavia, quando ho provato con CreateInstanceFromAndUnwrap ha funzionato bene. C'è ancora una confusione creata dal parametro assemblyName che in realtà si riferisce al nome del file e il suo percorso non è il nome dell'assembly. – iamadnan

Problemi correlati