通过元数据嵌入版本信息
本文关键字:版本 信息 元数据 | 更新日期: 2023-09-27 18:00:21
我有一个使用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的版本号?但我希望能够在加载插件之前访问这些信息。
所以你想在零件实例化之前得到它,对吧?您可以获取零件的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
cat core/maven-metadata.xml | tail-5 | head-1 | grep-o'[0-9].*'|awk-F'<''{打印$1}'