-2
我是MEF上的新手,我試圖使用MEF framewok爲我的C#應用程序添加插件可擴展性。如何基於Mef插件類創建變量
我正在從數據庫下載插件並通過byte []數據加載。
this.PluginCatalog.Catalogs.Add(new AssemblyCatalog(Assembly.Load(RawData)));
在嘗試使用基類的插件之前,所有東西都像魔術一樣工作。
我的一個插件正在尋找這樣的:
using System;
using System.Net;
using System.ComponentModel;
using System.ComponentModel.Composition;
using System.Reflection;
using PluginCommon;
namespace Plugins
{
[Export("Plugin", typeof(IPlugin))]
[PluginMetadata("DownloadManager", "1.0")]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class DownloadManager : INGPlugin
{
WebClient Client = new WebClient();
public string _text = "qwert";
public AsyncCompletedEventHandler dc { get; set; }
public DownloadProgressChangedEventHandler pc { get; set; }
public void Download(string url, string path)
{
Client.DownloadProgressChanged += this.pc;
Client.DownloadFileCompleted += this.dc;
Client.DownloadFileAsync(new Uri(url), path);
}
}
}
使用這個插件我需要創建下載管理器的變量類型化。我的插件大部分與本示例相同。我需要創建具有相同類型插件的插件實例。
我想我正在使用一個錯誤的接近,有人可以給我一些例子嗎?
最好的問候,
謝謝你的快速回答。爲了方便,我是全新的插件系統,我不必使用mef,如果我可以添加插件支持到我的應用程序。插件系統是必需的,因爲我從數據庫獲得授權的部分,這種方式讓我只更新一個插件或添加新的功能,而無需更新整個應用程序。如果我爲每個插件聲明一個接口,這可能仍然讓我更新插件,但那時我不能添加一個方法到同一個插件或我不能添加新的插件。 – Xhays 2014-10-30 20:04:44
@Xhays:如果你想從應用代碼中分離插件代碼,你需要有一個穩定的接口。不管你做什麼,你都不能添加一個方法,因爲現有的插件不會擁有它。歡迎來到版本控制的困難世界。 – SLaks 2014-10-30 20:08:10
謝謝你的建議。當我嘗試在Visual Studio中快速觀看「((Plugins.DownloadManager)PController.GetPlugin(」DownloadManager「)))」。 PController.GetPlugin返回部分的IPlugin。它讓我檢查插件中的所有變量和方法。 (插件DLL沒有被引用到應用程序)。但是同樣的命令行在我的代碼中不起作用,即使我試圖設置插件的參照。你知道什麼樣的機制使用vs檢查插件方法嗎? – Xhays 2014-10-30 20:13:43