Próbuję zatrzymać pliki DLL blokujące aplikacje w katalogu wtyczek MEF, dzięki czemu mogę nadpisać złożenia w czasie wykonywania (uwaga: Nie próbuję ponownie załadować MEF ich w locie, przy następnym uruchomieniu aplikacji jest w porządku, po prostu nie chcę, aby zatrzymać aplikację, aby zrobić kopię)Pliki DLL MEF i ShadowCopying, dzięki czemu mogę je zastąpić w czasie wykonywania
Próbuję to zrobić, tworząc domenę app skopiowane cień dla moich załadowanych zespołów mef poniżej:
[Serializable]
public class Composer:IComposer
{
private readonly string _pluginPath;
public Composer(IConfigurePluginDirectory pluginDirectoryConfig)
{
_pluginPath = pluginDirectoryConfig.Path;
var setup = new AppDomainSetup();
setup.ShadowCopyFiles = "true"; // really??? is bool not good enough for you?
var appDomain = AppDomain.CreateDomain(AppDomain.CurrentDomain.FriendlyName + "_PluginDomain", AppDomain.CurrentDomain.Evidence, setup);
appDomain.DoCallBack(new CrossAppDomainDelegate(DoWorkInShadowCopiedDomain));
}
private void DoWorkInShadowCopiedDomain()
{
// This work will happen in the shadow copied AppDomain.
var catalog = new AggregateCatalog();
var dc = new DirectoryCatalog(_pluginPath);
catalog.Catalogs.Add(dc);
Container = new CompositionContainer(catalog);
}
public CompositionContainer Container { get; private set; }
}
a następnie dostęp do katalogu komponentów MEF za pośrednictwem CompositionContainer na tej klasie. Jednak wydaje się, że kontener kompozycji jest inicjowany tylko wewnątrz domeny shadowcopy (co ma sens), a to oznacza, że jest ona pusta w mojej domenie aplikacji. Właśnie zastanawiałem się, czy istnieje lepszy sposób to zrobić lub jakiś sposób do zapytania domeny, aby uzyskać moje składniki MEF
Wygląda na to, że można po prostu wywołać File.Copy na wszystkich plikach w katalogu wtyczek, używając własnego ręcznie utworzonego katalogu shadow. Następnie wystarczy załadować ze ścieżki cienia w głównej domenie. –
Zastanowiłem się nad tym, ale rozumiem, że jest to problem, który ma rozwiązać kopiowanie w tle (dlatego prawdopodobnie mają do czynienia z bardziej ograniczonymi przypadkami). Czy wiesz, że shadowcopying jest większy niż to, czy robi kopię ręcznie wystarczająco dobrze? –
@DanBryant na podstawie odpowiedzi Czuję, że jest to najlepsze rozwiązanie dla nas, jeśli umieścisz to jako odpowiedź przed końcem nagrody, nagrodzę cię nagrodą. –