Domanda

Qualcuno ha idea di cosa potrebbe far saltare semplicemente il caricatore di Fusion su una DLL senza alcun avviso o riconoscimento?

Quando provo a farlo (in C #) da un'applicazione da riga di comando

Assembly.LoadFrom("c:\\Deploy\\bin\\WebServices.dll")

Vedo questo:

  

" Impossibile caricare uno o più dei tipi richiesti. Recupera la proprietà LoaderExceptions per ulteriori informazioni. & Quot;

Quella DLL ha una dipendenza da Platform.DLL, ma il caricamento di quella dipendenza non riesce, quindi questa riga di codice genera un'eccezione. Quando controllo il messaggio di caricamento dell'assemblaggio Fusion, questo è quello che vedo:

=== Pre-bind state information ===
LOG: DisplayName = Platform, Version=9.0.0.0, Culture=neutral, PublicKeyToken=null (Fully-specified)

...

LOG: This bind starts in LoadFrom load context.
WRN: Native image will not be probed in LoadFrom context. Native image will only be probed in default load context, like with Assembly.Load().
LOG: No application configuration file found.
LOG: Using machine configuration file from C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\config\\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform.DLL.
LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform/Platform.DLL.
LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform.EXE.
LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform/Platform.EXE.
LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform.DLL.
LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform/Platform.DLL.
LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform.EXE.
LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform/Platform.EXE.

Il fatto è che la DLL è presente in c: \ Deploy \ bin \ Platform.DLL , con la versione corretta e nessuna chiave pubblica firmata.

Cose a cui ho pensato:
1. Forse è davvero una dipendenza di Platform.DLL che viene interrotta, causando questo comportamento? (Ho inseguito l'albero delle dipendenze in Reflector ma non ho trovato DLL mancanti)
2. Forse c'è una mancata corrispondenza rilascio / debug o 64-bit vs 32-bit? ma tutto è stato costruito sulla stessa macchina
3. Forse sto leggendo male i log, ma non dovrebbe fermarsi quando colpisce una DLL che trova? Non vedo né il " riuscito " O il "non riuscito" messaggio in questo registro. So solo che è fallito a causa dell'eccezione.

PS altri dettagli tecnici:
L'ambiente macchina è Windows 2008 a 64 bit, con .NET 2.0, 3.0 e amp; 3.5 installato.
Questa stessa applicazione funziona perfettamente su un altro computer (Vista a 32 bit), con la stessa struttura di directory e DLL, sebbene siano stati creati su quel computer

È stato utile?

Soluzione

Sì, dovrebbe fermarsi quando trova la DLL richiesta, quindi il quinto "Tentativo di scaricare ..." avrebbe dovuto trovarlo ...

Tuttavia, da dove viene eseguita l'app della riga di comando? Se è la cartella Debug, alcune cose che puoi provare sono

  1. Le DLL dipendenti si trovano nella stessa cartella
  2. Firma l'assembly e fai riferimento attraverso un file .config nel seguente formato

    <dependentAssembly>
        <assemblyIdentity name="WebServices.dll" publicKeyToken="<whatever this public key it>" />
        <codeBase version="1.0.0.0" href="..\WebServices.dll" />
    </dependentAssembly>
    
  3. Firmarli e quindi inserire gli assembly dipendenti nel GAC.

Potrei essere molto lontano, ma ci sono alcune cose da provare.

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