2012-04-15 13 views
8

Moja aplikacja ładuje wszystkie zestawy bibliotek znajdujące się w jego ścieżce wykonywania i wykonuje znane metody względem zawartych klas.Załaduj złożenie w czasie wykonywania, które odwołuje się do wywołującego zestawu

Teraz muszę zrobić to samo z zespołem, który odwołuje się do mojego zestawu aplikacji. Czy jest to możliwe i czy są jakieś negatywne konsekwencje, o których powinienem wiedzieć?

Mistrz Montaż:

public abstract class TaskBase 
{ 
    public abstract void DoWork(); 
} 

LoadAssemblyFromFile("Assembly0001.dll"); 
Assembly0001.Task1.DoWork(); 

dziećmi konfekcjonowane:

public sealed class Task1: MasterAssembly.TaskBase 
{ 
    public override void DoWork { /* whatever */ } 
} 
+0

Robię to przez cały czas bez żadnych problemów. Jedynym problemem, na który napotkałem (kilka razy w rzeczywistości) jest zarządzanie wersjami zespołu _master_. Jeśli wprowadzisz zmiany do _master'a bez rekompilacji dzieci, możesz natknąć się na dziwne problemy. –

+0

@ M.Babcock: Dzięki. Z ciekawości, jakie problemy? Nie dokonuję automatycznej inkrementacji wersji zestawu podczas rekompilacji. Przypuszczam, że POWINIEN omijać wszelkie problemy, które napotkaliście. Twoje myśli? –

+0

Najczęstszym napotkanym problemem jest to, że definicja metody zmienia zerwanie kompatybilności wstecznej, chociaż w innych przypadkach doświadczyłem przerażającego "_Type_ jest zdefiniowany w wyjątku zarówno _Master_, jak i _Master_" (z pamięci, więc nie jest to tekst dosłowny, ale zamknięty na tyle, że go rozpoznasz). –

Odpowiedz

6

Tak, jest to możliwe. Dopóki twoje zgromadzenie mistrzowskie nie odwołuje się do zwojów dziecka, powinieneś być w porządku. W przeciwnym razie będziesz mieć zależność cykliczną.

Zespół główny po prostu załaduje zespoły potomne i nie będzie nic o nich wiedział, poza tym, że implementuje interfejs. W ten sposób zespół nadrzędny nie musi odwoływać się do zespołów podrzędnych.

Żadnych gotchów, o ile mi wiadomo. Z powodzeniem używamy tej techniki w niektórych scenariuszach.

+0

Dzięki. Poza kontekstem, czy istnieje sposób na ładowanie złożeń z pamięci bez obecności pliku złożenia na dysku? Te okresowe wydania zespołów są obecne w centralnej bazie danych i wolałbym, aby użytkownicy mieli dość racjonalne trudności, aby dostać się w ich ręce. Oczywiście rozumiem, że nie ma na to sposobu, aby to osiągnąć. –

+0

Tak, mieliśmy takie aplikacje mobilne. Zbiór binarny był przechowywany w bazie danych, pobierany i ładowany w ten sposób. Możesz zrobić to samo. –

+0

Znaleziono: Assembly.Load (byte []). –

1

W moim doświadczeniu nie ma nic złego w tym. W rzeczywistości, MEF używa tej techniki w postaci AssemblyCatalog (gdzie twoje implementacje są w zespole głównym) i DirectoryCatalog (gdzie implementacje interfejsu są w złożeniach w określonym katalogu).

Obie mogą być używane razem w AggregateCatalog bez żadnych problemów.

0

Jedynym „problemem” jest to, że nie można napisać Assembly0001.Task1 w zespole Mistrza, ale można znaleźć poprawną zadanie w załadowanej montażu i powoływać się, że jeden:

var asm = LoadAssemblyFromFile("Assembly0001.dll"); 
var taskType = asm.GetTypes().FirstOrDefault(t => typeof(TaskBase).IsAssignableFrom(t)); 
var task = (TaskBase)Activator.CreateInstance(taskType); 
task.DoWork(); 

Będziesz nadal trzeba dodać dodatkowe kontrole bezpieczeństwa :)

+0

Tak, oczywiście. Tworzenie instancji czasu wykonywania według typu jest jedynym sposobem osiągnięcia tego. Jakie rodzaje kontroli bezpieczeństwa poleciłbyś? Aplikacja musi upewnić się, że wykonuje swój własny kod (prawdopodobnie poprzez hash jednokierunkowy). Co jeszcze? –

+0

Cóż, w większości tylko zerowe sprawdzenia, jeśli naprawdę chcesz stworzyć piaskownicę do wykonywania zadań, może stać się nieco trudniejsza. – XIU

0

Nie wpisałeś kodu swojej metody LoadAssemblyFromFile ("..."), ale jeśli używa on Assembly.LoadFrom() lub Assembly.LoadFile() do ładowania złożeń, ty może uzyskać wyjątek InvalidCastException, MissingMethodException lub inne wyjątki, szczególnie jeśli aplikacja i załadowany zespół odnoszą się do tego samego zestawu. LoadFrom() i LoadFile() ładują złożenia w innym kontekście powiązania niż aplikacja. Szczegółowe informacje na ten temat można znaleźć w dokumencie this.

Powiązane problemy