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

标签 c# metadata mef versioning

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

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

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

我的元数据接口(interface)定义为:

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

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

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

最佳答案

所以你想在零件实例化之前得到它,对吧?您可以获取部件的 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

关于c# - 通过元数据嵌入版本信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14985710/

相关文章:

c# - 在映射文件的 NHibernate ID 生成器部分中,分配和选择的含义是什么?

c# - 为什么这个事件处理程序多次抛出异常?

java - Android MediaMetadataRetriever 从大多数键返回空值

c# - 创建导入的 MEF 部件的多个实例

c# - 微软图: Invalid batch payload format

c# - 从大 float 中删除 E 符号,C#?

php - composer update 给出关于私有(private)存储库元数据的 404

anaconda - 元数据可以成为 Orange3 中的目标变量吗?

c# - 带有托管扩展框架 (MEF) 的工厂模式

c# - MEF 的零件特定设置