3 Stimmen

MEF-basierte Anwendung funktioniert hervorragend auf lokalem Rechner, importiert aber keine AddIns, wenn sie über eine Netzwerkfreigabe ausgeführt wird

Ich konvertiere eine selbstentwickelte Plugin-Architektur zu MEF von .NET 4.0. Die MEF-basierte Anwendung funktioniert wunderbar, wenn sie von meinem lokalen Rechner aus ausgeführt wird. Wenn ich die Anwendung auf eine Netzwerkfreigabe verschiebe und dann ausführe, lädt MEF jedoch meine Plugins nicht mehr.

Wenn ich eine Debugging-Sitzung an den Prozess anschließe und das DirectoryCatalog-Objekt untersuche, sehe ich, dass in den Eigenschaften Assemblies oder Parts keine Einträge vorhanden sind. Der FullPath ist das richtige Verzeichnis und die LoadFiles-Eigenschaft enthält alle DLLs in dem durchsuchten Verzeichnis.

Zuerst dachte ich, es handele sich um ein CasPol-Problem, bis ich versuchte, CasPol zu ändern, und eine Warnung erhielt, dass CasPol in .NET 4.0 nicht mehr standardmäßig aktiviert ist. Es muss etwas anderes sein. Ich habe Vollzugriffsrechte auf das betreffende Verzeichnis.

Hier ist die Eigenschaft, die die importierten AddIns enthalten wird:

[ImportMany]
private IEnumerable<IRecipient> RecipientAddIns;

Und hier ist die Methode, die die AddIns entdeckt und importiert:

private void LoadRecipientAddIns()
{
  using (var catalog = new AggregateCatalog())
  {
    // Look for IRecipient AddIns in the ./Recipients directory.
    catalog.Catalogs.Add(new DirectoryCatalog("Recipients"));

    // Look for IRecipient AddIns in subdirectories hanging off of ./Recipients.
    foreach (string currentDirPath in Directory.GetDirectories("Recipients"))
      catalog.Catalogs.Add(new DirectoryCatalog(currentDirPath));

    using (var compositionContainer = new CompositionContainer(catalog))
    {
      compositionContainer.ComposeParts();
      compositionContainer.SatisfyImportsOnce(this);

      // The discovered AddIns should now be in the RecipientAddIns property.
    }

    // Do stuff with the Recipient AddIns
    foreach (var recipient in this.RecipientAddIns)
    {
      ...
    }
  }

  // Clear the list of discovered Recipient AddIns
  this.RecipientAddIns = null;
}

Irgendwelche Ideen?

Ich danke Ihnen.

3voto

Daniel Plaisted Punkte 16486

Versuchen Sie, die Baugruppen selbst zu laden (z. B. mit Assembly.Load oder LoadFrom). Ich vermute, Sie werden eine Ausnahme erhalten, die der DirectoryCatalog wahrscheinlich verschluckt. Die Ausnahme sollte Ihnen helfen, herauszufinden, was falsch ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X