MEF на Mono не работает должным образом? - PullRequest
2 голосов
/ 23 января 2009

Я сделал очень простой пример 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):

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

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

.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

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

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

Есть предложения?

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

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

Ответы [ 3 ]

4 голосов
/ 29 января 2009

С последней версией MEF (Preview 4 - http://www.codeplex.com/MEF) все работает просто отлично!

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

3 голосов
/ 23 января 2009

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

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

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

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

0 голосов
/ 26 января 2009

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

...