Question

Quelqu'un at-il une idée de ce qui ferait que le chargeur Fusion ignore simplement une DLL sans avertissement ni accusé de réception?

Lorsque j'essaie de le faire (en C #) à partir d'une application en ligne de commande

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

Je vois ceci:

  

"Impossible de charger un ou plusieurs des types demandés. Récupérez la propriété LoaderExceptions pour plus d'informations. "

Cette DLL a une dépendance sur Platform.DLL, mais le chargement de cette dépendance échoue et cette ligne de code lève une exception. Lorsque je vérifie le message de chargement de l'assemblage Fusion, voici ce que je vois:

=== 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.

En réalité, la DLL est présente dans c: \ Deploy \ bin \ Platform.DLL , avec la version appropriée et aucune clé publique signée.

Ce que j'ai pensé:
1. Peut-être que c'est vraiment une dépendance de Platform.DLL qui est cassée et qui cause ce comportement? (J'ai analysé l'arbre de dépendance dans Reflector, mais je n'ai trouvé aucune DLL manquante.)
2. Peut-être y a-t-il une incompatibilité libération / débogage, ou un 64 bits vs 32 bits? mais tout a été construit sur la même machine
3. Je me trompe peut-être dans les journaux, mais cela ne devrait-il pas s'arrêter lorsqu'il rencontre une DLL détectée? Je ne vois pas non plus le " réussi " OU le message "non réussi" message dans ce journal. Je sais juste que cela a échoué à cause de l'exception.

PS plus de détails techniques:
L’environnement de la machine est Windows 2008 64 bits, avec .NET 2.0, 3.0 et amp; 3.5 installé.
Cette même application fonctionne parfaitement sur une autre machine (Vista 32 bits), avec la même structure de répertoires et les mêmes DLL, bien que celles-ci aient été créées sur cette machine

Était-ce utile?

La solution

Oui, il devrait s’arrêter dès qu’il a trouvé la dll requise, ce qui fait que le cinquième " Tentative de téléchargement ... " aurait dû le trouver ...

Cependant, d'où provient l'application en ligne de commande? Si c’est le dossier de débogage, voici quelques solutions que vous pouvez essayer:

  1. Les dll dépendantes sont dans le même dossier
  2. Signer l'assemblage et la référence via un fichier .config au format suivant

    <dependentAssembly>
        <assemblyIdentity name="WebServices.dll" publicKeyToken="<whatever this public key it>" />
        <codeBase version="1.0.0.0" href="..\WebServices.dll" />
    </dependentAssembly>
    
  3. Signez-les, puis placez les assemblys dépendants dans le GAC.

Je suis peut-être mal parti, mais voici quelques petites choses à essayer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top