2009-01-23 8 views
2

J'ai fait un très simple exemple MEF qui fonctionne sur .NET, mais ne fonctionne pas correctement sur Mono.MEF sur Mono ne fonctionne pas correctement?

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.ComponentModel.Composition; 

namespace Vialis 
{ 
    class Program 
    { 
     [Import(typeof(ILedController))] 
     public List<ILedController> Controllers 
     { 
      get; 
      set; 
     } 

     static void Main(string[] args) 
     { 
      new Program(); 
     } 

     public Program() 
     { 
      compose(); 
      selectController(); 

      Console.ReadLine(); 
     } 

     private void compose() 
     { 
      var catalog = new DirectoryPartCatalog("controllers"); 
      var container = new CompositionContainer(catalog); 

      container.AddPart(this); 
      container.Compose(); 
     } 

     private void selectController() 
     { 
      Console.Clear(); 
      Console.WriteLine("Please select the controller to use\n"); 

      byte i = 0; 

      foreach (var controller in Controllers) 
      { 
       Console.WriteLine("\t{0}) {1}", i, controller.ToString()); 
       i++; 
      } 

      Console.Write("\nYour selection: "); 
      var input = Convert.ToInt32(Console.ReadLine()); 

      Controllers[input].DisplayText(10, 10, "Hello World"); 
     } 
    } 
} 

Ceci est l'interface:

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace Vialis 
{ 
    public interface ILedController 
    { 
     void DisplayText(int x, int y, string text); 
    } 
} 

Ceci est la première mise en œuvre:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.ComponentModel.Composition; 

namespace Vialis 
{ 
    [Export(typeof(ILedController))] 
    public class LyanController : ILedController 
    { 
     public void DisplayText(int x, int y, string text) 
     { 
      Console.SetCursorPosition(x, y); 
      Console.ForegroundColor = ConsoleColor.Red; 
      Console.WriteLine(text); 
     } 
    } 
} 

La deuxième mise en œuvre:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.ComponentModel.Composition; 

namespace Vialis 
{ 
    [Export(typeof(ILedController))] 
    public class VialisController : ILedController 
    { 
     public void DisplayText(int x, int y, string text) 
     { 
      Console.SetCursorPosition(x, y); 
      Console.ForegroundColor = ConsoleColor.Green; 
      Console.WriteLine(text); 
     } 

    } 
} 

C'est ce qui se passe sur .NET (Windows):

.NET http://lh5.ggpht.com/_GWubgra2SwM/SXl-yoSRLtI/AAAAAAAADwI/sGR0FjLfg8Q/controller-selection-windows.jpg

Sélection des contrôleurs:

.NET 1 http://lh3.ggpht.com/_GWubgra2SwM/SXl-yYzs-aI/AAAAAAAADwE/WomfaQqv_Xc/vialis-controller-windows.jpg

.NET 2 http://lh6.ggpht.com/_GWubgra2SwM/SXl-yE1Q-cI/AAAAAAAADwA/qznnEkiNokA/lyan-controller-windows.jpg

Mais en utilisant Mono 2.2, les assemblées ne se chargent pas:

Mono http://lh5.ggpht.com/_GWubgra2SwM/SXl-xw0YXOI/AAAAAAAADv8/7j2UxJott04/controller-selection-macos.jpg

Des suggestions?

INFO: Google semble avoir des problèmes de picasa web, c'est pourquoi les images ne se chargent pas. Les images montrent que sur Mac OS, aucun contrôleur n'est répertorié.

+0

Dans mes lecteurs newsreader sont affichés correctement (google reader), mais sur ce site, ils ne sont pas ...bizarre – TimothyP

Répondre

4

Avec la dernière version MEF (Preview 4 - http://www.codeplex.com/MEF) cela fonctionne très bien!

Puisque le bug n'est plus pertinent j'ai voté pour fermer cette question.

+0

Merci de nous le faire savoir, Timothy. J'ai appuyé votre vote. –

3

Je suppose donc que les exportations sont définies dans les assemblées externes, parce que vous utilisez le DirectoryPartCatalog .. soit il y a un problème avec le chemin de la gestion des fichiers dans le catalogue ou le problème est dans le AttributedAssemblyPartCatalog/AttributedTypesPartCatalog

en interne, le DirectoryPartCatalog encapsule chaque assemblage découvert dans un AttributedAssemblyPartCatalog qui à son tour utilise un AttributedTypesPartCatalog

votre meilleur pari est d'ajouter le projet MEF dans votre solution, au lieu de la dll, et définir un point de rupture dans les constructeurs les plus avides de DirectoryPartCatalog & AttributedAssemblyPartCatal og et l'étape jusqu'à ce que u trouver le problème

Unfortunatly Je n'ai pas une configuration de la machine mono donc je ne peux pas aider plus que cela

0

Ajout de l'interface et les deux mises en œuvre à l'ensemble d'application fonctionne. Donc, je vais avoir déboguer comme vous l'avez suggéré, besoin de trouver un débogueur décent pour mono cependant.

+0

Je commencerais par le chemin que vous passez à DirectoryPartCatalog - J'ai seulement un sentiment de gutt, mais il semble bien que cela pourrait être un cas de mono (peut-être sur OSX) traitant les chemins différemment que NETFX sous Windows. – TheCodeJunkie

Questions connexes