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());
}
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();
}
}
}
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());
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With