2009-10-13 11 views
6

Jak mogę poinformować moją aplikację .NET, gdzie szukać określonego zestawu, którego potrzebuje (poza GAC ​​lub folderem, z którego uruchamiana jest aplikacja)? Na przykład chciałbym umieścić zespół w folderze Temp użytkownika i mieć moją aplikację wiedzieć, że odwołanie Zgromadzono w folderze temp.Poszukiwanie zestawu .NET w innym miejscu

Dzięki

Odpowiedz

6

można użyć zdarzenia AppDomain.AssemblyResolve dodać niestandardowy montażowe przeliczniki. Dzięki temu możesz wskazać inne katalogi lub nawet bazy danych, aby uzyskać assemblie w razie potrzeby.

Użyłem nawet podobnego kodu do pobrania złożeń z bazy danych i zapisania w IsolatedStorage. Nazwa pliku jako skrót nazwy pełnego zestawu. Następnie baza danych musiałaby zostać pobrana tylko przy pierwszym rozwiązaniu, a wszystkie przyszłe rozwiązania będą obsługiwane przez system plików. Najlepiej o zdarzeniu AssemblyResolve można użyć Type.GetType() i wbudowanych Serializers.

static string lookupPath = @"c:\otherbin"; 

static void Main(string[] args) 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += 
     new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
} 

static Assembly CurrentDomain_AssemblyResolve(object sender, 
               ResolveEventArgs args) 
{ 
    var assemblyname = new AssemblyName(args.Name).Name; 
    var assemblyFileName = Path.Combine(lookupPath, assemblyname + ".dll"); 
    var assembly = Assembly.LoadFrom(assemblyFileName); 
    return assembly; 
} 
+1

Jak wspomniano [tutaj] (http://www.codeproject.com/Articles/310675/AppDomain-AssemblyResolve-Event- Wskazówki), użyj 'string assemblyname = new AssemblyName (args.Name) .Name;' zamiast używać 'Split (',')'. – kroimon

+0

Dzięki za sugestię. –

3

Zobacz tę dyskusję na niektóre z zagadnień:

http://bytes.com/topic/c-sharp/answers/248203-dynamic-assembly-loading

Zasadniczo nie można zmienić appbase danego AppDomain po to został stworzony. Musisz go określić jako część konfiguracji przed utworzeniem nowej, która nie pomoże Ci w domyślnym appdomain .

Jeżeli montaż chcesz wczytać się w katalogu pod bieżącym appbase następnie można dodać swoją ścieżkę względną używając AppendPrivatePath (relativePath), a następnie użyć Assembly.Load - runtime sprawdzi podkatalogi dla ty. To jest najlepszy/najłatwiejszy sposób na obsłużenie go.

+0

Dziękuję, tak jak notatkę, nie muszę ładować jej dynamicznie. Odwołuję się do zgromadzenia w moim projekcie. Ale kiedy wdrażam tę aplikację, chcę, aby aplikacja wiedziała, że ​​zestaw referencyjny znajdzie się w folderze tymczasowym –

Powiązane problemy