首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试图找出MEF合成错误意味着什么

试图找出MEF合成错误意味着什么
EN

Stack Overflow用户
提问于 2010-12-06 03:46:46
回答 1查看 9.8K关注 0票数 5

对于试图完成对.ComposeParts(this)的调用的以下异常,我有一个问题:

合成产生一个单一的合成错误。根本原因如下。查看CompositionException.Errors属性以获得更详细的信息。

1)输出'CustomersModule.CustomerMenu (ContractName=‘ModLibrary.IMenu’)不能指定为ModLibrary、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null‘’。

结果:无法在部件'ModAppWorks.Host‘上设置导入'ModAppWorks.Host.Menus (ContractName=“ModLibrary.IMenu”)。元素: ModAppWorks.Host.Menus (ContractName="ModLibrary.IMenu") -> ModAppWorks.Host

其中有一部分似乎是错误意味着IMenu必须实现IEnumerable。这是我的作文代码:

代码语言:javascript
复制
static class Program
{
    [STAThread]
    static void Main()
    {
        Host host = new Host();
        host.Run();
    }
}

class Host
{
    #region Init
    public Host()
    { }
    #endregion

    #region Functions
    public void Run()
    {
        Compose();

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new AppHost());
    }

    private void Compose()
    {
        var agrCatalog = new AggregateCatalog();
        var dirCatalog = new DirectoryCatalog(Path.GetDirectoryName
            (Assembly.GetExecutingAssembly().Location) + "..\\..\\..\\Extensions", "*.dll");
        var asmCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());

        agrCatalog.Catalogs.Add(dirCatalog);
        agrCatalog.Catalogs.Add(asmCatalog);

        var hostContainer = new CompositionContainer(agrCatalog);
        hostContainer.ComposeParts(this);
    }
    #endregion

    #region Properties
    [Import(typeof(IMenu))]
    public IEnumerable<IMenu> Menus { get; set; }
    #endregion

我正在导入一个实例为ToolStripMenuItem的类。我的出口样品:

代码语言:javascript
复制
[Export(typeof(IMenu))]
public class CustomerMenu : IMenu
{
    #region Fields
    private System.Windows.Forms.ToolStripMenuItem CustomerMainMenu;
    private System.Windows.Forms.ToolStripSeparator mnuSeparator;
    private System.Windows.Forms.ToolStripMenuItem CustomersMenuItem;
    #endregion

    #region Init
    public CustomerMenu()
    {
        InitializeComponent();
        // 
        // CustomerMenu
        // 
        this.CustomerMainMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
        this.mnuSeparator,
        this.CustomersMenuItem});
        this.CustomerMainMenu.Name = "CustomerMenu";
        this.CustomerMainMenu.Size = new System.Drawing.Size(94, 20);
        this.CustomerMainMenu.Text = "Customer Menu";
        // 
        // toolStripMenuItem1
        // 
        this.mnuSeparator.Name = "toolStripMenuItem1";
        this.mnuSeparator.Size = new System.Drawing.Size(149, 6);
        // 
        // Customers
        // 
        this.CustomersMenuItem.Name = "Customers";
        this.CustomersMenuItem.Size = new System.Drawing.Size(152, 22);
        this.CustomersMenuItem.Text = "Customers";
    }

    #endregion

    #region Functions
    private void InitializeComponent()
    {
        this.CustomerMainMenu = new System.Windows.Forms.ToolStripMenuItem();
        this.mnuSeparator = new System.Windows.Forms.ToolStripSeparator();
        this.CustomersMenuItem = new System.Windows.Forms.ToolStripMenuItem();
    }

    #endregion

如果不需要IMenu实现IEnumerable,是否有人看到我可能做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-06 03:51:34

在导入导出集合时,需要使用ImportMany属性对其进行显式说明。更改属性属性如下:

代码语言:javascript
复制
[ImportMany(typeof(IMenu))] 
public IEnumerable<IMenu> Menus { get; set; } 

您还应该能够排除契约(“type (菜单)”参数),因为您导入的是导出的相同类型。不过,将合同保留在Export上。

代码语言:javascript
复制
[ImportMany] 
public IEnumerable<IMenu> Menus { get; set; } 
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4363022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档