2013-02-20 39 views
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; } 
} 

我已经有了不知道关于“???????”有什么用?在第一部分。

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

+0

AssemblyVersionInformation究竟是什么?它只是程序集版本(如1.0.1.0)? – 2013-02-20 22:16:48

回答

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