Je regardais la documentation msdn et je ne sais toujours pas quelle est exactement la différence entre l'utilisation LoadFile
et le LoadFrom
chargement d'un assemblage. Quelqu'un peut-il donner un exemple ou une analogie pour mieux le décrire. La documentation MSDN m'a encore plus troublé. En outre, est ReflectionOnlyLoadFrom
le même que LoadFrom
sauf qu'il charge l'assemblage uniquement en mode réflexion.
Étant donné que mon expérience .NET n'est pas la meilleure, voici quelques questions concernant la documentation MSDN utilisant LoadFile:
1) Que signifie LoadFile
examiner les assemblys qui ont la même identité, mais sont situés dans des chemins différents? Quelle est l'identité (exemple)?
2) Il indique LoadFile
que ne charge pas les fichiers dans le 'Contexte LoadFrom' et ne résout pas les dépendances en utilisant le chemin de chargement. Qu'est-ce que cela signifie, quelqu'un peut-il donner un exemple?
3) Enfin, il déclare que cela LoadFile
est utile dans ce scénario limité car LoadFrom ne peut pas charger des assemblys qui ont les mêmes identités mais des chemins différents; il ne chargera que la première de ces assemblées, ce qui m'amène à nouveau à la même question, quelle est l'identité des assemblées?
Réponses:
Est-ce que cela clarifie les choses?
Edit : pour répondre aux questions que vous avez soulevées dans votre question révisée, vous voulez absolument lire Suzanne Cook sur l'identité de l'assemblée .
Il existe de nombreuses règles qui régissent la façon dont les assemblys sont chargés, et certaines d'entre elles ont à voir avec la façon dont ils résolvent les dépendances - si votre AssemblyA dépend de AssemblyB, où .NET doit-il rechercher AssemblyB? Dans le Global Assembly Cache, le même répertoire où il a trouvé AssemblyA, ou ailleurs entièrement? De plus, s'il trouve plusieurs copies de cet assemblage, comment devrait-il choisir lequel utiliser?
LoadFrom
a un ensemble de règles, tandisLoadFile
qu'un autre ensemble de règles. Il est difficile d'imaginer de nombreuses raisons à utiliserLoadFile
, mais si vous deviez utiliser la réflexion sur différentes copies du même assemblage, elle est là pour vous.la source
string.Compare(x, y) == 0
? Je pense que tu veuxx == y
là? Si, pour des raisons obscures, vous voulez un contrôle d'égalité dépendant de la culture, il est plus clair d'écrirestring.Equals(x, y, StringComparison.CurrentCulture)
, par exemple.Du blog de Suzanne Cook :
Regardez ici .
Consultez également l'article Choisir un contexte de liaison sur le même blog.
la source
Après avoir beaucoup gratté la tête, j'ai moi-même découvert une différence cet après-midi.
Je voulais charger une DLL au moment de l'exécution, et la DLL vivait dans un autre répertoire. Cette DLL avait ses propres dépendances (DLL) qui vivaient également dans ce même répertoire.
LoadFile (): a chargé la DLL spécifique, mais pas les dépendances. Ainsi, lorsque le premier appel a été effectué à partir de la DLL vers l'une de ces autres DLL, il a lancé une FileNotFoundException.
LoadFrom (): a chargé la DLL que j'ai spécifiée ainsi que toutes les dépendances qui vivaient dans ce répertoire.
la source
FileNotFoundException
lors de la création d'une nouvelle instance d'un objet défini dans un assembly référencé par l'assembly que je venais de charger.LoadFile
. Changer cela.LoadFrom
semble résoudre le problème, mais je ne savais pas pourquoi! MerciRemarque: Si un assembly est chargé à l'aide d'un chemin 8.3, puis à partir d'un chemin non 8.3, ils seront considérés comme des assemblys différents, même s'il s'agit de la même DLL physique.
la source
.NET a un contexte de chargement différent. Suzanne Cook a écrit à leur sujet ici: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx
C'est ainsi que .Net met en quarantaine que les références ne sont pas mélangées.
la source
une différence que j'ai remarquée est:
Assembly.LoadFile - Charge l'assembly dans différents AppDomain avec des droits d'utilisateur limités (principe de différence). des opérations telles que la sérilisation / déserilisation n'ont pas pu être effectuées.
Assembly.LoadFrom - Charge l'assembly dans le même AppDomain avec les mêmes droits d'utilisateur (même principel).
la source
Dans mon cas, je devais simplement supprimer le cache de l'application ASP situé @
C:\Windows\Microsoft.NET\Framework\[asp version]\Temporary ASP.NET Files
. Il est reconstruit lors de la première exécution du site. Assurez-vous d'abord d'arrêter IIS.J'espère que cela aide quelqu'un comme ça l'a fait pour moi.
la source