MEF на Mono не работает должным образом?

Я сделал очень простой пример MEF, который работает на .NET, но не работает должным образом на Mono.

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");
        }
    }
}

Это интерфейс:

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

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

Это первая реализация:

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);
        }
    }
}

Вторая реализация:

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);
        }

    }
}

Вот что происходит в .NET (Windows):

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

Выбор контроллеров:

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

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

Но при использовании Mono 2.2 сборки не загружаются:

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

Какие-либо предложения ?

ИНФОРМАЦИЯ: Похоже, у Google проблемы с веб-сайтом Picasa, поэтому изображения не загружаются.

На рисунках видно, что в Mac OS контроллеры не указаны.


person TimothyP    schedule 23.01.2009    source источник
comment
В моей читалке картинки отображаются корректно (гугл ридер), а на этом сайте нет... странно   -  person TimothyP    schedule 25.01.2009


Ответы (3)


В последнем выпуске MEF (предварительная версия 4 — http://www.codeplex.com/MEF) работает просто отлично!

Поскольку ошибка больше не актуальна, я проголосовал за закрытие этого вопроса.

person TimothyP    schedule 29.01.2009
comment
Спасибо, что сообщили нам, Тимоти. Я поддержал ваш голос. - person Matt Hamilton; 01.02.2009

Итак, я предполагаю, что экспорт определен во внешних сборках, потому что вы используете DirectoryPartCatalog. Либо есть проблема с обработкой пути к файлу в каталоге, либо проблема в AttributedAssemblyPartCatalog/AttributedTypesPartCatalog

Внутренне DirectoryPartCatalog оборачивает каждую обнаруженную сборку в AttributedAssemblyPartCatalog, который, в свою очередь, использует AttributedTypesPartCatalog.

Лучше всего добавить проект MEF в свое решение вместо dll и установить точку останова в самых жадных конструкторах DirectoryPartCatalog и AttributedAssemblyPartCatalog и шагать до тех пор, пока не найдете проблему.

К сожалению, у меня нет монофонической установки, так что больше ничем помочь не могу.

person TheCodeJunkie    schedule 23.01.2009

Добавление интерфейса и двух реализаций в сборку приложения работает. Так что у меня будет отладка, как вы предложили, но нужно найти приличный отладчик для моно.

person TimothyP    schedule 26.01.2009
comment
Я бы начал с пути, который вы передаете в DirectoryPartCatalog - у меня есть только предчувствие, но похоже, что это может быть случай, когда моно (возможно, в OSX) обрабатывает пути иначе, чем NETFX в Windows. - person TheCodeJunkie; 26.01.2009