关于c#:如何获取具有MEF插件的每个DLL的版本号?

How do I get the version number of each DLL that has my MEF plugins?

我有许多实现IDessertPlugin的类。它们存在于各种DLL中,我使用MEF对它们的实例进行旋转,以便在应用程序中用作插件功能。

所以我想做的是显示我使用mef从中加载插件的DLL的版本号。一个或多个插件是在一个或多个DLL中定义的,这些DLL是我在应用程序中加载的。

现在我这样做:

1
2
3
4
5
6
7
8
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(
   new DirectoryCatalog(Path.Combine(
      Path.GetDirectoryName(Assembly.GetExecutingAssembly().location),"Plugins")));

var container = new CompositionContainer(catalog);

container.ComposeParts(this);

这将从我的应用程序运行的plugins子目录加载插件。

做一些类似的事情

1
catalog.Catalogs.First().Parts.First().GetType().Assembly.FullName

只返回"system.componentmodel.composition,version=4.0.0.0,…"

我希望能知道的是,我有cakeplugins.dll的1.0版和icecreamplugins.dll的1.1版。插件本身没有版本属性-我想依赖于DLL的版本。希望这是合理的。

我还不知道我在那里使用的是哪个DLL,所以我可以在它们上调用Assembly.GetName().Version

思想?

解决方案:

所以,我的问题的解决方案在组成部分之后非常简单。

我的插件管理代码有这样一个条目:

1
2
[ImportMany(typeof(IDessertPlugin)]
private IEnumerable<IDessertPluing> dessertPlugins;

一旦容器部件组合发生,我就可以像这样迭代我的插件:

1
2
3
4
foreach(var plugin in dessertPlugins)
{
   Console.WriteLine(Assembly.GetAssembly(plugin.GetType()).GetName().Version.ToString());
}


您可以从不同的属性AssemblyVersionAssemblyFileVersionAssemblyDescription获得程序集信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
                /// <summary>
                /// This class provide inforamtion about product version.
                /// </summary>
                public class ProductVersion
                {
                    private readonly FileVersionInfo fileVersionInfo;

                    private readonly AssemblyName assemblyName;


                    private ProductVersion(Type type)
                    {
                        // it done this way to prevent situation
                        // when site has limited permissions to work with assemblies.
                        var assembly = Assembly.GetAssembly(type);
                        fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
                        assemblyName = new AssemblyName(assembly.FullName);
                    }

                    public string AssemblyFileVersion
                    {
                        get
                        {
                            return fileVersionInfo.FileVersion;
                        }
                    }

                    public string AssemblyVersion
                    {
                        get
                        {
                            return assemblyName.Version.ToString();
                        }
                    }



                }


所以,我的问题的解决方案在组成部分之后非常简单。我试图深入挖掘MEF对象本身,而不是查看包含我加载的所有插件的容器。答案是完全忽略了这些插件是如何被加载的事实,只需查看实例化对象本身。

我的插件管理代码有这样一个条目:

1
2
[ImportMany(typeof(IDessertPlugin)]
private IEnumerable<IDessertPluing> dessertPlugins;

一旦容器部件组合发生,我就可以像这样迭代我的插件:

1
2
3
4
foreach(var plugin in dessertPlugins)
{
   Console.WriteLine(Assembly.GetAssembly(plugin.GetType()).GetName().Version.ToString());
}