2013-07-31 16 views
6

Sto utilizzando AppDomain.CreateInstanceFromAndUnwrap() per creare un oggetto in un diverso AppDomain. Non riuscivo a farlo funzionare perché continuava gettare il seguente errore di me:Problema con AppDomain.CreateInstanceFromAndUnwrap

Impossibile caricare il file o l'assembly 'comON, Version = 2.0.4960.27874, Culture = neutral, PublicKeyToken = null' o una delle le sue dipendenze. Il modulo avrebbe dovuto contenere un manifest assembly.

Tuttavia, ho scoperto che è perché tenta di caricare la mia DLL (che ha lo stesso nome del mio assembly. NET).

Questo è come io chiamo il metodo:

_script = (Script)_appDomain.CreateInstanceFromAndUnwrap(Assembly.GetExecutingAssembly().Location, "COMon.Scripting.Script"); 

Funziona bene fino a quando non v'è un file DLL nativa con lo stesso nome del mio assembly .NET. Perché succede quando passo il percorso completo e il nome del mio assembly .NET?

+0

Puoi dirlo in un modo completamente diverso? Stai dicendo che c'è un'altra DLL con lo stesso nome della tua DLL gestita? Perché non basta cambiare il nome della DLL gestita? – JerKimball

+0

La mia applicazione .NET si chiama COMon.exe, ho anche una DLL nativa che si chiama COMon.dll. Potrei semplicemente rinominare la DLL, trovo strano che cerchi di guardare nella DLL quando ho passato il percorso completo del mio eseguibile. – mnoergaard

+0

Gotcha: è strano; Hai provato ad attivare la registrazione Fusion per vedere cosa diavolo sta provando a fare il runtime durante il caricamento dell'assembly? – JerKimball

risposta

3

quando sto passando il percorso completo e il nome file del mio assembly .NET?

Non è così che funziona il metodo. Il primo argomento è il nome di visualizzazione dell'assembly. Non è un nome di file. L'articolo MSDN consiglia di dare un'occhiata a Assembly.FullName per ulteriori informazioni sui nomi visualizzati.

Quindi le normali regole di ricerca CLR saranno effettive per la ricerca dell'assieme. Apparirà prima nel GAC, quindi nel percorso di verifica per l'AppDomain. Con una stranezza su cui non hai fatto affidamento, il CLR fa non presta attenzione all'estensione del nome file per un file. Il nome visualizzato per un assembly non lo specifica. Quindi considera un EXE e un equivalente DLL. Qualcosa che puoi vedere nella traccia di Fuslogvw.exe, l'utilità che vuoi sempre usare quando hai problemi come questo. E in altri posti, aggiungere un riferimento a un EXE funziona bene per esempio.

Quindi trova COMon.exe e questo è un kaboom, non è un assembly gestito.

Non è chiaro quale potrebbe essere la soluzione alternativa nel caso, a parte il semplice rinominazione dell'assieme. Quando si armeggia con AppDomain, in genere si desidera utilizzare AppDomainSetup e impostare la proprietà ApplicationBase o PrivateBinPath.

+0

Grazie per la spiegazione. Non intendi il secondo argomento? (http://msdn.microsoft.com/en-us/library/y7h7t2a2.aspx). Ora lo chiamo in questo modo: _script = (Script) _appDomain.CreateInstanceFromAndUnwrap (Assembly.GetExecutingAssembly(). Location, typeof (COMon.Scripting.Script) .FullName); – mnoergaard

+0

No, intendevo il primo. Assembly.Location è un percorso file, non un nome di visualizzazione assembly. –

+0

@HansPassant Pensato che potrebbe essere il caso ... ben risposto – JerKimball