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

▼魔方 西西 提交于 2019-12-12 07:55:54

问题


I've got a number of classes which implement IDessertPlugin. These are found in various DLLs which I use MEF to spin up instances of them to use as plug-in functionality in my application.

So what I'm wanting to do is display the version number of the DLLs from which I've loaded plugins using MEF. One or more plugins are defined in one or more DLLs which I load up in my application.

Right now I do something like so:

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);

And that will load up plugins just fine from the Plugins subdirectory where my application runs.

Doing something like

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

just returns "System.ComponentModel.Composition, Version=4.0.0.0, ..."

What I was hoping to be able to know was that I've got Version 1.0 of CakePlugins.dll and Version 1.1 of IceCreamPlugins.dll. The plugins themselves don't have a version attribute about them - I'm wanting to rely upon the version of the DLL. Hope that makes sense.

I haven't figured out to know which DLLs I'm using there so that I can call Assembly.GetName().Version on them.

Ideas?


Solution:

So, the solution to my problem was pretty straightforward after the parts have been composed.

My plugin managing code has an entry like so:

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

and once the container parts composition has taken place, I could iterate through my plug-ins like so:

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

回答1:


You can get assembly info from different properties AssemblyVersion, AssemblyFileVersion and AssemblyDescription.

                /// <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();
                        }
                    }



                }



回答2:


So, the solution to my problem was pretty straightforward after the parts have been composed. I was trying to dig down into the MEF objects themselves rather than look into the container that holds all the plug-ins I've loaded. The answer was to totally ignore the fact of how those plug-ins were being loaded and just look at the instantiated objects themselves.

My plugin managing code has an entry like so:

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

and once the container parts composition has taken place, I could iterate through my plug-ins like so:

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


来源:https://stackoverflow.com/questions/11848785/how-do-i-get-the-version-number-of-each-dll-that-has-my-mef-plugins

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!