通过元数据嵌入版本信息?

时间:2013-02-20 17:07:12

标签: c# metadata mef versioning

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

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

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

我的元数据界面定义为:

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

我不知道怎么办“???????”在第一部分。

我承认我的问题非常类似于: How do I get the version number of each DLL that has my MEF plugins?但我希望能够在 加载插件之前访问 这些信息。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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