Estoy intentando detener mi aplicación bloqueando archivos DLL en mi directorio de complemento MEF para poder sobrescribir los ensamblados en tiempo de ejecución (nótese que en realidad no estoy tratando de tener MEF recargar ellos sobre la marcha, en el siguiente inicio de la aplicación está bien, simplemente no quiero tener que detener la aplicación para hacer la copia)MEF y ShadowCopying DLL para poder sobrescribirlos en tiempo de ejecución
Estoy tratando de hacer esto creando un dominio de aplicación de copia sombra para mis ensamblados mef cargados de la siguiente manera:
[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; }
}
y luego acceder a mi catálogo de componentes MEF a través del CompositionContainer en esta clase. Sin embargo, el contenedor de composición parece que solo se inicializó dentro del dominio shadowcopy (lo cual tiene sentido) y esto significa que es nulo en mi dominio de aplicación. Me preguntaba si hay una mejor manera de hacer esto o alguna forma de consultar dominios cruzados para obtener mis componentes MEF
Parece que podría simplemente llamar a File.Copy en todos los archivos en el directorio del complemento, utilizando su propio directorio oculto creado manualmente. Luego solo carga desde la ruta de sombra en su dominio principal. –
Pensé en esto, pero tengo entendido que este es el problema que se supone que debe resolver el copiado en la sombra (por lo que probablemente tengan más casos extremos cubiertos con esto). ¿Sabes si la copia oculta es más grande que esto o si la copia manual es lo suficientemente buena? –
@DanBryant basado en las respuestas que he recibido. Siento que esta es la mejor solución para nosotros, si la publicas como respuesta antes de que termine la recompensa, te otorgaré la recompensa. –