单声道MEF无法正常工作?

时间:2009-01-23 08:39:40

标签: .net mono mef

我做了一个非常简单的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时,程序集无法加载:

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

有什么建议吗?

信息:谷歌似乎有一些picasa网络问题,       这就是图像无法加载的原因。

图片显示,在Mac OS上,未列出任何控制器。

3 个答案:

答案 0 :(得分:4)

使用最新的MEF版本(预览4 - http://www.codeplex.com/MEF),它的工作正常!

由于这个错误不再相关,我投票决定关闭这个问题。

答案 1 :(得分:3)

所以我假设导出是在外部程序集中定义的,因为你使用DirectoryPartCatalog ..目录中的文件路径处理存在问题,或者问题出在AttributedAssemblyPartCatalog / AttributedTypesPartCatalog

DirectoryPartCatalog在内部将每个发现的程序集包装到AttributedAssemblyPartCatalog中,后者又使用AttributedTypesPartCatalog

最好的办法是将MEF项目添加到您的解决方案中,而不是dll中,并在DirectoryPartCatalog&amp;的最贪婪的构造函数中设置一个断点。 AttributedAssemblyPartCatalog和步骤,直到找到问题

不幸的是,我没有单声道机器设置,所以我无法帮助

答案 2 :(得分:0)

将接口和两个实现添加到应用程序程序集中。 所以我会像你建议的那样进行调试,但需要为单声道找到一个不错的调试器。