Mam trochę kodu C# (nazwijmy to "skrypt") Kompiluję w czasie wykonywania. Używa interfejsu w moim głównym programie, którego używam, aby uzyskać dostęp do jego funkcji. Po zakończeniu kompilacji mam CompilerResults.CompiledAssembly
, w którym to przypadku mogę CreateInstance(Type)
.Rozładuj CodeDom-compiled assembly
Po zakończeniu pracy z skryptem chciałbym całkowicie rozładować. Z tego co rozumiem, mogę to zrobić tylko jeśli utworzyć oddzielną domenę aplikacji: Loading DLLs into a separate AppDomain
miałem kilka pytań szczegółowych do mojego realizacji:
- Jeśli mam wiele skryptów, aby skompilować i chcą wyładować niezależnie, czy muszę tworzyć oddzielne domeny aplikacji dla każdego?
- Jakich nazw domen aplikacji powinienem używać? Czy identyfikatory GUID będą dobrym pomysłem? Czy są jakieś nazwiska, których powinienem unikać?
- Jeśli zespół jest w oddzielnej domenie aplikacji, czy będzie miał problemy z dostępem do interfejsu w programie głównym? Obecnie robię
ReferencedAssemblies.Add(typeof(Interface).Assembly.Location)
przed kompilacją. - Czy mogę użyć
CompilerParameters GenerateInMemory=true
, czy muszę gdzieś to zapisać?
Miałem problemy z uzyskaniem tego, więc wykonałem więcej badań. Wygląda na to, że muszę jeszcze trochę popracować, żeby to zadziałało: http://www.devsource.com/c/a/Using-VS/Dynamic-Plugins-Using-the-codeAppDomaincode-Class-to-Load i Usuń kod /. O ile nie ma czegoś nowego w późniejszych wersjach? –
Wygląda na to, że mam szczęście. Odkąd używam .NET 3.5, mogę korzystać z Managed Extensibility Framework. Oczywiście, muszę się tego nauczyć. :) –
Wygląda na to, że wchodzę głębiej, niż chciałem/się spodziewałem. MEF w rzeczywistości nie może zwolnić złożeń, ponieważ nie używa oddzielnego elementu AppDomain. MAF (System.AddIn) może, ale jest o wiele bardziej skomplikowany w użyciu. MAF i MEF mogą być używane razem. Chociaż naprawdę chcę móc zwolnić zespół, myślę, że to będzie musiało poczekać przynajmniej na wersję 2. –