我做了一个非常简单的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)上发生的事情:
选择控制器:
但是使用Mono 2.2时,程序集无法加载:
有什么建议吗?
信息:谷歌似乎有一些picasa网络问题, 这就是图像无法加载的原因。
图片显示,在Mac OS上,未列出任何控制器。
答案 0 :(得分:4)
使用最新的MEF版本(预览4 - http://www.codeplex.com/MEF),它的工作正常!
由于这个错误不再相关,我投票决定关闭这个问题。
答案 1 :(得分:3)
所以我假设导出是在外部程序集中定义的,因为你使用DirectoryPartCatalog ..目录中的文件路径处理存在问题,或者问题出在AttributedAssemblyPartCatalog / AttributedTypesPartCatalog
DirectoryPartCatalog在内部将每个发现的程序集包装到AttributedAssemblyPartCatalog中,后者又使用AttributedTypesPartCatalog
最好的办法是将MEF项目添加到您的解决方案中,而不是dll中,并在DirectoryPartCatalog&amp;的最贪婪的构造函数中设置一个断点。 AttributedAssemblyPartCatalog和步骤,直到找到问题
不幸的是,我没有单声道机器设置,所以我无法帮助
答案 2 :(得分:0)
将接口和两个实现添加到应用程序程序集中。 所以我会像你建议的那样进行调试,但需要为单声道找到一个不错的调试器。