2012-06-11 7 views
9

trabajo con el MEF y estoy buscando la manera de cambiar la dirección URL de la ubicación de los plugins por otro medio que el MEF encontrar los plugins, quiero cambiar esta líneaplug-in de carga MEF desde el directorio

Assembly.LoadFrom(@"C:\julia\project\project.Plugin.Nav\bin\Debug\NavPlugin.dll"))); 

quiero eliminar este url porque necesito desplegar mi aplicación en otra máquina

ésta es mi función:

public void AssembleCalculatorComponents() 
{ 
    try 
    { 
     //var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 
     //var container = new CompositionContainer(catalog); 
     //container.ComposeParts(this); 
     var catalog = new AggregateCatalog(); 

     catalog.Catalogs.Add(new AssemblyCatalog(Assembly.LoadFrom(@"C:\yosra\project\project.Plugin.Nav\bin\Debug\NavPlugin.dll"))); 
     var container = new CompositionContainer(catalog); 

     container.ComposeParts(this); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

¿me podría ayudar?

Gracias

+8

Como nota al margen: no debe usar 'throw ex;' en su bloque catch (esto "destruye" el seguimiento de pila, es decir, no podrá saber realmente dónde está la excepción en realidad sucedió). Si desea volver a lanzar la excepción, simplemente use 'throw;' (sin especificar la excepción nuevamente) - ¡o simplemente ** no ** capture la excepción si no está haciendo nada con eso! –

Respuesta

5

Hola de nuevo y gracias por su respuesta, por lo que mi problema era cargar el plugin directamente, por lo que creo un directorio y pongo mis plugins en esta carpeta, así que encontrar esta solución

public void AssembleCalculatorComponents() 
     { 


      string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins"); 
      Console.WriteLine(path); 
      //Check the directory exists 
      if (!Directory.Exists(path)) 
      { 
       Directory.CreateDirectory(path); 
      } 
      Console.WriteLine(path); 
      string assemblyName = Assembly.GetEntryAssembly().FullName; 
      Console.WriteLine(assemblyName); 
      //Create an assembly catalog of the assemblies with exports 
      var catalog = new AggregateCatalog(
       new AssemblyCatalog(Assembly.GetExecutingAssembly().Location), 
       new AssemblyCatalog(Assembly.Load(assemblyName)), 
       new DirectoryCatalog(path, "*.dll")); 

      //Create a composition container 
      var container = new CompositionContainer(catalog); 
      container.ComposeParts(this); 

esto es mi solución, piensa para todos

2

dos opciones.

  1. Utilice el directorio actual como raíz para sus complementos. Environment.CurrentDirectory debe orientarlo en la dirección correcta.
  2. utilizar un app.config para especificar un directorio de los plugins que se van a almacenar.
16

Usted puede utilizar la clase DirectoryCatalog tener MEF escanear un directorio en particular para los conjuntos que satisfacen sus importaciones.

var catalog = new AggregateCatalog(); 
catalog.Catalogs.Add(new DirectoryCatalog(".")); 
var container = new CompositionContainer(catalog); 

Lo anterior agregará el directorio base el dominio de aplicación utiliza para la localización de conjuntos (normalmente el directorio que contiene el ejecutable menos que se modifiquen con la configuración) al catálogo agregado. También es probable que desee agregar el ensamblaje de ejecución actual, aunque no es obligatorio.

var catalog = new AggregateCatalog(); 
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
catalog.Catalogs.Add(new DirectoryCatalog(".")); 
var container = new CompositionContainer(catalog); 

Más información sobre MSDN para DirectoryCatalog: http://msdn.microsoft.com/en-us/library/system.componentmodel.composition.hosting.directorycatalog.aspx

+0

Gracias por su respuesta, cambio para este código 'var catalog = new AggregateCatalog(); catalog.Catalogs.Add (nuevo AssemblyCatalog (Assembly.GetExecutingAssembly())); catalog.Catalogs.Add (nuevo DirectoryCatalog (@ "./ plugins")); var container = new CompositionContainer (catalog); 'pero no funciona conmigo, ¿puedes explicarme más? – julia

1

Si su método de sabe de del tipo que se crea una instancia, se puede utilizar la propiedad Assembly del Type que es típico de mi * Dominio * bibliotecas; de lo contrario, puede usar Assembly.GetExecutingAssembly(). No soy especialmente aficionado a GetExecutingAssembly() o GetCallingAssembly() ...:

public void AssembleCalculatorComponents() { 
    try { 
     var asmCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 
    // OR 
     asmCatalog = new AssemblyCatalog(typeof(TObject).Assembly); // replace TObject with object's actual type 
     var aggregateCatalog = new AggregateCatalog(asmCatalog); 
     // 
     AddDirectoryCatalogs(aggregateCatalog.Catalogs)); 
     var container = new CompositionContainer(catalog); 

     // assuming this class has the member(s) to be composed. 
     container.ComposeParts(this); 
    } catch (Exception ex) { 
     throw ex; 
    } 
    } 

Aparte de eso, puede añadir DirectoryCatalogs - ya sea por el archivo app.config, lista serializada de directorios, etc. Partiendo, sin embargo, puede designar un directorio predeterminado en su app.config - que es lo que recomiendo. Entonces, suponiendo que esté utilizando Settings:

private readonly Settings settings = Settings.Default; 

void AddDirectoryCatalogs(ICollection<ComposablePartCatalog> Catalogs agrCatalogs) { 
    agrCatalogs.Add(new DirectoryCatalog(settings.DefaultPath, settings.DefaultPattern)); 
    // add more directory catalogs 
} 

Durante el uso de "." como la ruta de búsqueda es un atajo legítimo al directorio del ensamblaje de ejecución, tenga en cuenta que todos los conjuntos se buscaron piezas que cumplen - es decir, a juego Import/Export objetos. El uso de patrones específicos es mi recomendación. Los ejemplos de Microsoft no son conocidos por ser las mejores prácticas de . Si espera que cualquier complemento tenga el sufijo Plugin.dll, haga esa parte de su patrón de búsqueda.

Cuestiones relacionadas