我有许多实现了 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());
}
最佳答案
您可以从不同的属性 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();
}
}
}
关于c# - 如何获取具有我的 MEF 插件的每个 DLL 的版本号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11848785/