2011-08-08 12 views
5

Mam domena aplikacji podrzędnej, w której chcę załadować niektóre biblioteki DLL przy uruchamianiu i zwalnianiu plików, aby każdy mógł je usunąć.Załaduj zestaw do potomnej aplikacji AppDomain i zwalniaj plik DLL

Na rozruchu zrobić

Loader al = (Loader)domain.CreateInstanceAndUnwrap(
typeof(Loader).Assembly.FullName, 
typeof(Loader).FullName); 
al.Load(path) 

do następnej klasy.

class Loader : MarshalByRefObject 
{ 
    internal void Load(string path) 
    { 
     Assembly assembly; 
     try 
     { 
      assembly = Assembly.Load(File.ReadAllBytes(path)); 
     } 
     catch (Exception) { return; } 
    } 
    internal UseType(string fullyQualifiedTypeName) 
    { 
     Type userType = Type.GetType(fullyQualifiedTypeName); 
    } 
} 

Później powołać UseType i uzyskać prawidłowy typ, ale nie jestem w stanie usunąć plik dłużej, bo to tak jakby dziecko app-domena została zablokowana dll.

Zasadniczo chcę uzyskać pamięć podręczną pliku zespołu podczas uruchamiania, a następnie użyć wywołań GetType, aby faktyczny plik dll został zwolniony.

Czy naprawdę można osiągnąć coś takiego?

+0

CreateInstanceAndUnwrap() pobiera również typ załadowany do podstawowej aplikacji. Który blokuje plik. Użyj typu interfejsu zdefiniowanego w oddzielnym zestawie. –

+0

Moim zadaniem jest posiadanie pliku zawierającego program ładujący, który ma być zablokowany. Lub dowolny typ używany w metodach Loadera spowoduje, że jego montaż zostanie załadowany w nadrzędnej domenie aplikacji? – Egor

+0

Zobacz także: http://stackoverflow.com/questions/6480140/appdomain-shadow-copying-not-working-original-ssemblyblocks-locked – cdiggins

Odpowiedz

5

Użyj kopii w tle podczas tworzenia domeny aplikacji. To kopiuje biblioteki DLL do pamięci podręcznej i każdy może wchodzić w interakcje z systemem plików.

Topshelf robi to z naszym regałem (wszystko w nim żyje w swojej własnej domenie app) - https://github.com/Topshelf/Topshelf/blob/v2.3/src/Topshelf/Model/ShelfReference.cs#L126.

Aktualizacja: Topshelf już tego nie robi, ale zaktualizował link do wersji, która to zrobiła.

+0

Dzięki za odpowiedź! – Egor

+0

Nie ma problemu, mam nadzieję, że pomogło! – Travis

+0

Tak, pomógł! Również wymagana jest ustawiona właściwość ShadowCopyDirectories, jeśli biblioteki pochodzą ze źródła niestandardowego. – Egor

Powiązane problemy