2012-03-26 16 views
5

Tengo una aplicación MEF que funciona muy bien cuando se ejecuta localmente, pero no funciona cuando se la llama de forma remota en un recurso compartido de red.Composición de MEF cuando la aplicación está en un recurso compartido de red

Estoy usando Assembly.LoadFrom para evitar problemas UNC, pero viendo que todos los dlls están situados al lado del exe, realmente no pensé que este sería el problema, pero lo intenté de cualquier forma.

También solucioné los problemas de ConfigurationManager.GetSection, que parece ser un problema común con los permisos de .NET 4, después de buscar en msdn.

Estoy permitiendo <loadFromRemoteSources enabled="true"/> en el archivo de configuración. Entonces no estoy seguro de dónde podría estar el problema.

Editar: El ProductDispatcher en la excepción está definitivamente en el catálogo.Parts.

El código de configuración del contenedor y el catálogo:

var catalog = new AggregateCatalog(); 

var dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 

foreach (string file in Directory.GetFiles(dir, "XXX*.dll")) 
{ 
    var assembly = Assembly.LoadFrom(file); 
    catalog.Catalogs.Add(new AssemblyCatalog(assembly)); 
} 

var container = new CompositionContainer(catalog); 
var batch = new CompositionBatch(); 
batch.AddPart(this); 
container.Compose(batch); 

la importación (que he intentado hacer público):

[ImportMany(typeof(IEntityTypeDispatcher))] 
private IEnumerable<IEntityTypeDispatcher> Dispatchers { get; set; } 

Un ejemplo de una exportación es:

[Export(typeof(IEntityTypeDispatcher))] 
internal class ContactDispatcher : EntityTypeDispatcher<Contact> 

El error de excepción que recibo es:

The composition produced a single composition error. The root cause is provided below. Review the CompositionException.Errors property for more detailed information. 

1) Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information. 

Resulting in: An exception occurred while trying to create an instance of type 'XXX.XXX.Dispatch.ProductDispatcher'. 

Resulting in: Cannot activate part 'XXX.XXX.Dispatch.ProductDispatcher'. 
Element: XXX.XXX.Dispatch.ProductDispatcher --> XXX.XXX.Dispatch.ProductDispatcher --> AssemblyCatalog (Assembly="XXX.XXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null") 

Resulting in: Cannot get export 'XXX.XXX.Dispatch.ProductDispatcher (ContractName="XXX.XXX.Dispatch.IEntityTypeDispatcher")' from part 'XXX.XXX.Dispatch.ProductDispatcher'. 
Element: XXX.XXX.Dispatch.ProductDispatcher (ContractName="XXX.XXX.Dispatch.IEntityTypeDispatcher") --> XXX.XXX.Dispatch.ProductDispatcher --> AssemblyCatalog (Assembly="XXX.XXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null") 

Resulting in: Cannot set import 'XXX.XXX.Dispatch.DispatcherRepository.Dispatchers (ContractName="XXX.XXX.Dispatch.IEntityTypeDispatcher")' on part 'XXX.XXX.Dispatch.DispatcherRepository'. 
Element: XXX.XXX.Dispatch.DispatcherRepository.Dispatchers (ContractName="XXX.XXX.Dispatch.IEntityTypeDispatcher") --> XXX.XXX.Dispatch.DispatcherRepository 
(System.ComponentModel.Composition.CompositionException) 

    at System.ComponentModel.Composition.CompositionResult.ThrowOnErrors(AtomicComposition atomicComposition) 
    at System.ComponentModel.Composition.Hosting.ComposablePartExportProvider.Compose(CompositionBatch batch) 
    at System.ComponentModel.Composition.Hosting.CompositionContainer.Compose(CompositionBatch batch) 
    at XXX.XXX.Dispatch.DispatcherRepository.LoadDispatchers() in D:\Workspaces\XXX\Branches\Dev1\XXX.XXX\XXX.XXX\Dispatch\DispatcherRepository.cs:line 71 
    at XXX.XXX.Dispatch.DispatcherRepository.get_Instance() in D:\Workspaces\XXX\Branches\Dev1\XXX.XXX\XXX.XXX\Dispatch\DispatcherRepository.cs:line 34 
    at XXX.XXX.Dispatch.DispatcherRepository.GetDispatchers() in D:\Workspaces\XXX\Branches\Dev1\XXX.XXX\XXX.XXX\Dispatch\DispatcherRepository.cs:line 21 
    at XXX.XXX.Dispatch.Dispatcher.get_Instance() in D:\Workspaces\XXX\Branches\Dev1\XXX.XXX\XXX.XXX\Dispatch\Dispatcher.cs:line 30 
    at XXX.XXX.Broker..ctor() in D:\Workspaces\XXX\Branches\Dev1\XXX.XXX\XXX.XXX\Broker.cs:line 52 

Parece que MEF no funciona demasiado bien en escenarios de confianza parcial. ¿Hay algo que deba hacer para garantizar que todo se ejecute con plena confianza?

+0

tuve el mismo problema con mis proyectos, pero nunca fue lamentablemente capaz de solucionar este problema. :( – eandersson

Respuesta

3

Aunque haya habilitado "cargar desde fuentes remotas", esto podría estar ocurriendo porque los archivos aún pueden tener restricciones sobre ellos.

NTFS admite la capacidad de aplicar metadatos a un archivo en una secuencia de datos alternativa (ADS). Esto incluirá la información de zona (por ejemplo, zona de Internet, etc.).

Esto podría ser lo que está causando problemas con los archivos ubicados en la red, pueden clasificarse en la Zona de Internet y, por lo tanto, aún se pueden bloquear.

revisar este artículo y ver si esto se resolverá para usted: http://mikehadlow.blogspot.co.uk/2011/07/detecting-and-changing-files-internet.html

Cuestiones relacionadas