C# 如何通过MEF获取导入的UserControl的程序集信息,而不实例化UserControl?

C# 如何通过MEF获取导入的UserControl的程序集信息,而不实例化UserControl?,c#,import,assemblies,mef,C#,Import,Assemblies,Mef,是否可以从导入的MEF类型获取程序集信息,而不实例化类型?我需要知道包含该类型的插件控件的程序集名称和版本。尝试了以下操作,但它只返回System.ComponentModel.Composition foreach (Lazy<UserControl, IMetadata> content in contents) { // get assembly information of the Plugin control for the imported function

是否可以从导入的MEF类型获取程序集信息,而不实例化类型?我需要知道包含该类型的插件控件的程序集名称和版本。尝试了以下操作,但它只返回System.ComponentModel.Composition

foreach (Lazy<UserControl, IMetadata> content in contents)
{
    // get assembly information of the Plugin control for the imported function 
    string definingAssembly = content.GetType().Assembly.GetName();
    Console.WriteLine(definingAssembly);
}
foreach(内容中的惰性内容)
{
//获取导入函数的插件控件的程序集信息
字符串definingAssembly=content.GetType().Assembly.GetName();
控制台写入线(定义总成);
}

为了尽可能避免维护问题,我希望避免在元数据中指定此信息。

您尝试的操作应该失败,因为程序集永远不会是动态加载的模块程序集

我猜如果你不实例化一个类型,那个模块程序集甚至不会加载到内存中

你试着发到MEF讨论板了吗?在那里你可能会遇到开发者

这是一个时常出现的常见问题解答。(我确信有几个更好的线程包含了答案,但我无法立即找到答案)

MEF不支持开箱即用地检查延迟导入的部件类型(不实例化该部件)。这可能是因为其设计理念中有两个要素:

  • MEF鼓励松耦合。您应该根据合同指定和使用导入。依赖导入的实际类类型将阻止您将来更改组合

  • MEF允许延迟加载类型。假设有一个
    Lazy.PartType
    属性,您可以使用它来检查零件的实际类型。这将强制加载零件类型和包含部件。然后,根据
    零件类型
    确定不希望实例化该特定零件,并且装配加载是徒劳的

    (据我所知,目前MEF尚未利用现成的第二个设计功能。AssemblyCatalog将在调用
    AssemblyCatalog.Parts
    时立即检查所有类型。但MEF源中有一个示例显示了如何缓存有关程序集的信息以延迟或避免程序集加载。)


  • 因此,与依赖零件的确切类型不同,您应该添加一些元数据,用于选择导入。

    我一直在考虑这个问题,因为我自己也遇到过这个问题。我希望按需创建实例,而不是由合成为我创建实例

    foreach (Lazy<UserControl, IMetadata> content in contents)
    {
        // get assembly information of the Plugin control for the imported function 
        string definingAssembly = content.GetType().Assembly.GetName();
        Console.WriteLine(definingAssembly);
    }
    
    我的情况是,我不需要知道特定的类型,但我可能需要创建该类型的多个实例,使用它们,并在适当的时候处理它们。我提出的解决方案不是使用MEF来加载具体类型并强迫它为我创建实例,而是使用MEF来加载知道如何创建我想要控制生存期的类型实例的工厂

    MEF将加载并创建工厂,然后我可以使用工厂创建我可以随意使用和处置的实例