2013-02-20 31 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