2

我有一个使用 MEF 加载扩展的应用程序,我希望能够在MEF 实际加载扩展之前检索(程序集)版本信息。我相信如果程序集信息嵌入到扩展的元数据中,这是可以做到的。不幸的是,元数据似乎只接受设计时间常数值。也许有人可以告诉我别的?

理想情况下,我希望能够声明类似于以下的元数据:

[Export(typeof(IExtension))]
[ExportMetadata("Description", "Spell Checker")]
[ExportMetadata("AssemblyVersionInformation", "???????")]
public class MyExtension : IExtension
{
   ...
}

我的元数据接口定义为:

public interface IExtensionMetadata
{
   string Description { get; }
   string AssemblyVersionInformation { get; }
}

我不知道如何处理“???????” 在第一部分。

我承认我的问题与以下内容非常相似: 如何获取具有我的 MEF 插件的每个 DLL 的版本号? 但我希望能够在加载插件 之前访问这些信息。

4

2 回答 2

0

所以你想在零件实例化之前得到它,对吧?您可以获取ExportDefinition零件的 ,然后使用ReflectionModel.ReflectionModelServices.GetPartType获取类型。从那里您可以获取程序集,并直接读取其版本信息。

这是VB中的一个例子:

 Dim objPartDef As Primitives.ComposablePartDefinition

 objPartDef = myCatalog.Parts.Where(
       Function(objPart) objPart.ExportDefinitions.Count > 0 AndAlso
           objPart.ExportDefinitions(0).Metadata.ContainsKey("Description") AndAlso
        CStr(objPart.ExportDefinitions(0).Metadata("Description")) = "Spell Checker"
            ).FirstOrDefault()

 Dim objVersion as System.Version = ReflectionModel.ReflectionModelServices.GetPartType(objPartDef).Value.Assembly.GetName.Version

由于该问题被标记为 C#,因此这里尝试进行翻译。我没有 C# 编译器,也没有使用该语言,因此可能存在语法错误(我几乎肯定会弄错 lambda):

Primitives.ComposablePartDefinition objPartDef;

objPartDef = myCatalog.Parts.Where( objPart => objPart.ExportDefinitions.Count > 0 &&
   objPart.ExportDefinitions(0).Metadata.ContainsKey("Description") && 
   Convert.ToString(objPart.ExportDefinitions(0).Metadata("Description")) == "Spell Checker").FirstOrDefault();

System.Version objVersion = ReflectionModel.ReflectionModelServices.GetPartType(objPartDef).Value.Assembly.GetName.Version
于 2013-03-07T15:56:35.863 回答
0

猫核心/maven-metadata.xml | 尾-5 | 头-1 | grep -o '[0-9].*' |awk -F '<' '{print $1}'

于 2021-06-11T09:36:25.860 回答