Przeglądałem dokumentację msdn i nadal jestem trochę zdezorientowany, jaka dokładnie jest różnica między używaniem LoadFile
a LoadFrom
ładowaniem zestawu. Czy ktoś może podać przykład lub analogię, aby lepiej to opisać. Dokumentacja MSDN bardziej mnie zmyliła. Ponadto ReflectionOnlyLoadFrom
działa tak samo, jak LoadFrom
z tą różnicą, że ładuje zespół tylko w trybie odbicia.
Ponieważ moje doświadczenie z .NET nie jest najlepsze, oto kilka pytań dotyczących dokumentacji MSDN przy użyciu LoadFile:
1) Co to znaczy, że LoadFile
analizuje zespoły, które mają tę samą tożsamość, ale znajdują się na różnych ścieżkach? Jaka jest tożsamość (przykład)?
2) Stwierdza, że LoadFile
nie ładuje plików do „LoadFrom Context” i nie rozwiązuje zależności za pomocą ścieżki ładowania. Co to znaczy, czy ktoś może podać przykład?
3) Na koniec stwierdza się, że LoadFile
jest to przydatne w tym ograniczonym scenariuszu, ponieważ LoadFrom nie może załadować zestawów, które mają te same tożsamości, ale różne ścieżki; załaduje tylko pierwszy taki zestaw, co ponownie prowadzi mnie do tego samego pytania, jaka jest tożsamość zestawów?
Odpowiedzi:
Czy to wyjaśnia to?
Edycja : aby odpowiedzieć na pytania zadane w poprawionym pytaniu, na pewno chcesz przeczytać Suzanne Cook na temat Assembly Identity .
Istnieje wiele reguł, które regulują sposób ładowania zestawów, a niektóre z nich mają związek ze sposobem rozwiązywania zależności - jeśli AssemblyA jest zależna od AssemblyB, gdzie powinna szukać .NET, aby znaleźć AssemblyB? W Global Assembly Cache, w tym samym katalogu, w którym znalazł AssemblyA, czy zupełnie gdzie indziej? Ponadto, jeśli znajdzie wiele kopii tego zestawu, w jaki sposób powinien wybrać, którego użyć?
LoadFrom
ma jeden zestaw reguł, podczas gdyLoadFile
ma inny zestaw reguł. Trudno sobie wyobrazić wiele powodów, dla których warto skorzystaćLoadFile
, ale jeśli potrzebowałeś zastanowić się nad różnymi kopiami tego samego złożenia, to jest dla Ciebie.źródło
string.Compare(x, y) == 0
? Myślę, że chceszx == y
tam? Jeśli z niejasnych powodów chcesz, aby sprawdzanie równości zależało od kulturystring.Equals(x, y, StringComparison.CurrentCulture)
, na przykład bardziej jasne jest napisanie .Z bloga Suzanne Cook :
Zobacz tutaj .
Zobacz także artykuł o wybieraniu kontekstu powiązania na tym samym blogu.
źródło
Po wielu drapaniach po głowie sam odkryłem różnicę tego popołudnia.
Chciałem załadować bibliotekę DLL w czasie wykonywania, a biblioteka DLL mieszkała w innym katalogu. Ta biblioteka DLL miała własne zależności (biblioteki DLL), które również znajdowały się w tym samym katalogu.
LoadFile (): załadowano konkretną bibliotekę DLL, ale bez zależności. Więc kiedy pierwsze wywołanie zostało wykonane z wewnątrz biblioteki DLL do jednej z tych innych bibliotek DLL, zgłosiło wyjątek FileNotFoundException.
LoadFrom (): załadowano bibliotekę DLL, którą podałem, a także wszystkie zależności, które żyły w tym katalogu.
źródło
FileNotFoundException
podczas tworzenia nowego wystąpienia obiektu zdefiniowanego w zestawie, do którego odwołuje się zestaw, który właśnie załadowałem.LoadFile
. Zmiana tego na.LoadFrom
wydawała się rozwiązać problem, ale nie wiedziałem dlaczego! DziękiUwaga: Jeśli jeden zestaw jest ładowany przy użyciu ścieżki 8.3, a następnie ze ścieżki innej niż 8.3, będą one postrzegane jako różne zestawy, nawet jeśli są to ta sama fizyczna biblioteka DLL.
źródło
.NET ma inny kontekst ładowania. Suzanne Cook pisała o nich tutaj: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx
W ten sposób .Net poddaje kwarantannie, aby odwołania nie były pomieszane.
źródło
jedna różnica, którą zauważyłem, to:
Assembly.LoadFile - ładuje zestaw w różnych AppDomain z ograniczonymi prawami użytkownika (różnica Principel). nie można wykonać operacji takich jak serilizacja / deserilizacja.
Assembly.LoadFrom - ładuje zestaw w tej samej AppDomain z tymi samymi prawami użytkownika (ten sam podmiot).
źródło
W moim przypadku wystarczyło po prostu usunąć pamięć podręczną aplikacji ASP znajdującą się @
C:\Windows\Microsoft.NET\Framework\[asp version]\Temporary ASP.NET Files
. Jest odbudowywany podczas pierwszego uruchomienia witryny. Pamiętaj, aby najpierw zatrzymać usługi IIS.Mam nadzieję, że to pomoże komuś takiemu jak mnie.
źródło