我今天很惊讶收到这个错误,因为这是我从未遇到过的错误。代码中的所有内容看起来都不错,所以我进行了一些搜索。先前的问题及其各自的答案无济于事。当发帖人确保其装配引用一致时,This one得到解决。我现在没有这个问题,因为我当前正在解决方案中引用另一个项目。当指示发布者使用ImportMany时,This one已解决,但我已经在使用它(我也认为正确)来尝试加载多个插件当发布者意识到平台目标不匹配时,This one被解决。我已经完成了我的项目,以确保所有内容都针对x86。所以这就是我想要做的。我有一个拥有与设备连接的插件。我可能还需要能够与另一个插件共享该连接。我认为最干净的方法是创建一个接口,该接口将允许从属插件请求其自身与设备的连接。我们称之为IConnectionSharer。如果从属插件不需要借用此连接并拥有自己的连接,则它应使用自己的IConnectionSharer实现来连接到设备。我的“主”插件(拥有与设备的连接的插件)实现了IConnectionSharer。它还通过ExportAttribute导出它。我的“从属”插件程序集定义了一个类,该类还实现和导出IConnectionSharer。当应用程序加载时,意图是通过MEF使我的从属插件枚举所有IConnectionSharer并将它们存储在IEnumerable<IConnectionSharer>中。它是这样的:[ImportMany]public IEnumerable<IConnectionSharer> AllSharedConnections { get; set; }尼古拉斯让我展示我的Export,所以在这里。“主”插件:[PartCreationPolicy(CreationPolicy.Shared)][Export(typeof(Interface1))][Export(typeof(Interface2))][Export(typeof(Interface3))][Export(typeof(IConnectionSharer))]public partial class MasterPlugin : Interface1, Interface2, Interface3, IConnectionSharer{ ...}“从属”插件:[PartCreationPolicy(CreationPolicy.Shared)][Export(typeof(Interface1))]public class SlavePlugin : Interface1{ private Model _model { get; set; } private ViewModel _viewmodel { get; set; } [ImportingConstructor] public SlavePlugin( [Import] Model model) { _model = model; _viewmodel = new ViewModel( model); }}模型:[Export(typeof(Model))]public class Model{ [ImportMany(typeof(IConnectionSharer))] private IEnumerable<IConnectionSharer> AllSharedConnections { get; set; } ...}从属插件内部的IConnectionSharer实现:[Export(typeof(IConnectionSharer))]public class PrivateConnection : IConnectionSharer{ ...}但是在零件组成过程中,我收到错误,输出'Company.MasterPlugin(ContractName =“ IConnectionSharer”)'无法分配给类型'IConnectionSharer'。错误消息本身似乎已经足够清楚了-好像MEF认为我的主插件没有继承自IConnectionSharer ...而是!谁能建议进一步的调试策略?我将开始单步操作MEF源代码这一痛苦的过程。更新这是一个有趣的线索-如果在清除我的输出文件夹并重建解决方案之后,删除“ master”插件(以便“ slave”插件将使用其自己的IConnectionSharer对象),则我的应用程序加载正常,并且我的从属插件也表现出预期的效果。如果将主插件放回plugins文件夹中,则会再次遇到MEF组合问题。我还以为我会尝试使用Lazy 实例化来查看是否有任何效果。结果有些吃惊。 MEF抱怨此错误:无法填充集合'AllSharedConnections',因为它没有实现ICollection或为只读。如果该集合不是IEnumerable<T>或T [],则它必须实现ICollection,并且必须预先初始化或可以使用默认构造函数写入。HU?显然,AllSharedConnections是IEnumerable<T>,那么为什么MEF会抱怨? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 您很可能在输出文件夹中有一个旧版本的程序集,例如重命名后。通常这不是问题,因为没有其他程序集引用此旧程序集。但是,使用MEF,仅存在于应用程序文件夹中就可以拾取组合件。清理您的输出文件夹,重建并查看问题是否消失。编辑:由于清理输出文件夹时问题不会消失,所以我的下一个猜测是您有两个IConnectionSharer声明,或者将同一代码编译到两个不同的程序集中。这将导致两个IConnectionSharer接口具有相同的名称但标识不同。 (adsbygoogle = window.adsbygoogle || []).push({});
08-26 15:14