我有很多实现的课程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);
Run Code Online (Sandbox Code Playgroud)
这将从我的应用程序运行的Plugins子目录中加载插件.
做点什么
catalog.Catalogs.First().Parts.First().GetType().Assembly.FullName
Run Code Online (Sandbox Code Playgroud)
只返回"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;
Run Code Online (Sandbox Code Playgroud)
一旦容器部件组成发生,我可以迭代我的插件,如下:
foreach(var plugin in dessertPlugins)
{
Console.WriteLine(Assembly.GetAssembly(plugin.GetType()).GetName().Version.ToString());
}
Run Code Online (Sandbox Code Playgroud)
因此,在组成零件后,我的问题的解决方案非常简单。我试图深入研究 MEF 对象本身,而不是研究包含我已加载的所有插件的容器。答案是完全忽略这些插件如何加载的事实,只查看实例化的对象本身。
我的插件管理代码有一个像这样的条目:
[ImportMany(typeof(IDessertPlugin)]
private IEnumerable<IDessertPluing> dessertPlugins;
Run Code Online (Sandbox Code Playgroud)
一旦容器部件组合完成,我就可以像这样迭代我的插件:
foreach(var plugin in dessertPlugins)
{
Console.WriteLine(Assembly.GetAssembly(plugin.GetType()).GetName().Version.ToString());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
991 次 |
| 最近记录: |