我有很多实现IDessertPlugin
的课程。这些可以在各种DLL中找到,我使用MEF来旋转它们的实例,以便在我的应用程序中用作插件功能。
所以我想要做的是显示我使用MEF加载插件的DLL的版本号。一个或多个插件在一个或多个DLL中定义,我在我的应用程序中加载。
现在我做的事情是这样的:
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子目录中加载插件。
做类似
的事情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
。
想法?
解决方案:
因此,在编写部件后,我的问题的解决方案非常简单。
我的插件管理代码有一个类似的条目:
[ImportMany(typeof(IDessertPlugin)]
private IEnumerable<IDessertPluing> dessertPlugins;
一旦容器零件组成发生,我就可以像我这样迭代我的插件:
foreach(var plugin in dessertPlugins)
{
Console.WriteLine(Assembly.GetAssembly(plugin.GetType()).GetName().Version.ToString());
}
答案 0 :(得分:2)
您可以从不同的媒体资源AssemblyVersion
,AssemblyFileVersion
和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();
}
}
}
答案 1 :(得分:1)
因此,在编写了部件之后,我的问题的解决方案非常简单。我试图深入研究MEF对象本身,而不是查看容纳我已加载的所有插件的容器。答案是完全忽略这些插件如何被加载的事实,只是看看实例化的对象本身。
我的插件管理代码有一个类似的条目:
[ImportMany(typeof(IDessertPlugin)]
private IEnumerable<IDessertPluing> dessertPlugins;
一旦容器零件组成发生,我就可以像我这样迭代我的插件:
foreach(var plugin in dessertPlugins)
{
Console.WriteLine(Assembly.GetAssembly(plugin.GetType()).GetName().Version.ToString());
}