2009-09-22 18 views
10

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:

  1. Jeśli mam wiele skryptów, aby skompilować i chcą wyładować niezależnie, czy muszę tworzyć oddzielne domeny aplikacji dla każdego?
  2. Jakich nazw domen aplikacji powinienem używać? Czy identyfikatory GUID będą dobrym pomysłem? Czy są jakieś nazwiska, których powinienem unikać?
  3. 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ą.
  4. Czy mogę użyć CompilerParameters GenerateInMemory=true, czy muszę gdzieś to zapisać?

Odpowiedz

2

Odpowiedzi w kolejności:

  1. Tak, jeśli chcesz, aby wyładować je niezależnie będziesz potrzebują oddzielnych domen aplikacji.
  2. Użyj cokolwiek. Może pomóc w debugowaniu, jeśli uda ci się go zidentyfikować z powrotem do skryptu, ale będzie to bardziej prawdziwe w przypadku wątku wykonawczego.
  3. Nie tak długo, jak ustawisz podstawową ścieżkę konfiguracji domeny na własną.

    AppDomainSetup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;

  4. Nie musisz go zapisywać i nie wydaje Ci się, że przyniesie ci to korzyści.

+0

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? –

+0

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ć. :) –

+1

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. –

Powiązane problemy