Próbuję załadować zespoły w osobnej domenie aplikacji, ale używam w bardzo dziwny problem. Oto niektóre kodu:Ładowanie konfekcjonowane w oddzielnych AppDomain, coraz InvalidCastException
public static void LoadAssembly(string assemblyPath)
{
string pathToDll = Assembly.GetCallingAssembly().CodeBase;
AppDomainSetup domainSetup = new AppDomainSetup
{
PrivateBinPath = pathToDll
};
AppDomain newDomain = AppDomain.CreateDomain("AssemblyLoader",null,domainSetup);
AssemblyLoader loader = (AssemblyLoader)newDomain.CreateInstanceFromAndUnwrap(
pathToDll,
typeof(AssemblyLoader).FullName);
}
AssemblyLoader jest inna klasa w tym samym zespole, jak ten jeden, i to dziedziczy MarshalByRef, jednak z jakiegoś dziwnego powodu, otrzymuję wyjątek rzucania za każdym razem próbuję uruchomić to. Nawet utworzyłem ścieżkę do biblioteki DLL zamiast używać GetCallingAssembly(). CodeBase wciąż otrzymuję ten wyjątek.
Rozumiem, że ciężko jest odpowiedzieć na takie pytanie, nie widząc tego i mając więcej informacji, ale być może ktoś znalazł się w podobnej sytuacji i znał zwykłe "gotyki" i na co powinienem zwracać uwagę.
EDIT: Powodem nie chcę, aby załadować je bezpośrednio, ponieważ jest to tylko część kodu. Ostatecznym celem jest, aby ta klasa miała metodę, która ładuje zespoły, pobiera ich GUID i inne informacje o nich i przechowuje je w bazie danych dla projektu, nad którym pracuję. Dlatego jeśli załaduję ten zestaw w osobnej domenie aplikacji, będę mógł załadować tam również inne, a następnie zwolnić domenę aplikacji. Nie ma sensu ładowanie wszystkich tych zestawów na czas trwania aplikacji, jeśli tylko potrzebuję tych danych.
Jeśli klasa AssemblyLoader jest w tym samym zespole, jak ten jeden, dlaczego starasz się załadować go z newDomain? Dlaczego po prostu nie utworzyć instancji bezpośrednio? –
To sposób pośredniego ładowania wtyczek. Jeśli wystąpienie ładowarka jest w głównej aplikacji domeny, należy utworzyć wersję w domenie zagranicznych aplikacji i poprosić go, aby załadować wtyczki, które Cię interesują. Zapobiega swoje wtyczki od potrzebują wiedzieć, czy są one w stanie być obsługiwane przez osobną domenę aplikacji. (tj. wywodzi się z MarshalByRefObject) Utrzymuje to elastyczność projektowania (np. Utwórz klasę podstawową wtyczki, która zapewnia wszystkie funkcje współdzielone dla wtyczek). –