一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

.NET動態(tài)調用DLL的方法

  很多軟件都是可插拔的,最知名的便是微軟的Windows操作系統(tǒng)。你可以在Windows操作系統(tǒng)上安裝QQ,也可卸掉QQ,這便是可插拔。這里不談Windows的實現(xiàn),因為太過復雜。本文就談談管理軟件的可插拔的實現(xiàn)。相對Windows操作系統(tǒng),QQ就是它的一個插件。所以可以簡單的將開發(fā)可插拔的軟件分為兩個部分。一個是主應用程序的開發(fā),一個是插件的開發(fā)。

  比Windows小的,常見的可插拔的軟件是MSN。MSN主應用程序由MS開發(fā),還存在一些MSN插件開發(fā)商,國內好像也有不少,這些插件開發(fā)商通過在插件中植入廣告獲取利潤。MS不可能提高源代碼給這些開發(fā)商,那么MSN的主應用程序和MSN的插件是如何銜接起來的呢。我想應該是MS提供了一些接口和方法供開發(fā)商使用,估計有個api之類的東西,所以開發(fā)可插拔的應用系統(tǒng)分為三個部分。

  1、主應用程序的開發(fā)

  2、公用接口的開發(fā)

  3、插件的開發(fā)

  了解了這些以后,下面通過一個實例來說明。這個實例的原則是可擴展性強,能向下兼用。

  業(yè)務需求是:老系統(tǒng)每當逢年過節(jié)的時候,會通過郵件給用戶發(fā)送一些祝福的郵件。現(xiàn)在流行手機和MSN(QQ沒有借口)之后,客戶希望系統(tǒng)能通過手機短信和MSN的消息給用戶送去祝福。現(xiàn)在我們需要開發(fā)手機短信和MSN留言兩個插件,然后將它們安裝到系統(tǒng)中去。

  實現(xiàn):

  為了簡單起見,這里使用控制臺應用程序,如果你有興趣,可以修改成ASP.NET或者Windows Form的。

  定義兩個接口:

public interface IPluginHost
{
void AddMenuItem(string name, MenuItemClickedHandler clickHandler);
void RegisterComponent<T>(T component) where T : class;
void MailNotice(string messaage);
}
public delegate void MenuItemClickedHandler(string name);

  這個接口是主應用程序繼承的,現(xiàn)在只有MailNotice功能, AddMenuItem是供插件調用的方法,創(chuàng)建一個菜單。RegisterComponent是插件向主應用程序提供一些方法。

public interface IPlugin
{
void Initialize(IPluginHost pluginHost);
void DoSomething();
}

  上面是插件的接口。

  在主應用程序中有一個加載插件的地方。這里的插件是dll,所以我通過反射去加載這些dll。

public void LoadPlugin()
{
foreach (string fileName in Directory.GetFiles(Directory.GetCurrentDirectory() + "http://" + "Plugins", "*.dll"))
{
Assembly assembly = Assembly.LoadFile(fileName);
foreach (Type pluginType in assembly.GetTypes())
{
if (!pluginType.IsPublic || pluginType.IsAbstract || pluginType.IsInterface)
continue;
Type concreteType = pluginType.GetInterface(typeof(IPlugin).FullName, true);

if (concreteType != null)
{
IPlugin plugin = (IPlugin)Activator.CreateInstance(pluginType);
plugin.Initialize(this);
pluginList.Add(plugin);
break;
}
}
}
}

  主應用程序執(zhí)行的代碼如下:

void Start()
{
//郵件發(fā)送祝福
MailNotice("中秋快樂");
//加載插件
LoadPlugin();
//運行插件
if (pluginList.Count > 0)
{
foreach (IPlugin plugin in pluginList)
{
plugin.DoSomething();
}
}

Console.ReadLine();
}

  運行結果如下:

hhqqqq

  開發(fā)兩個插件,都繼承IPlugin。

  手機短信通知插件:

public class PluginA : IPlugin
{

public void Initialize(IPluginHost pluginHost)
{
IPluginHost myApplication = (IPluginHost)pluginHost;
myApplication.AddMenuItem("Click me", OnClick);

}
private void OnClick(string name)
{
Console.WriteLine("Omg! You clicked me!");
}

public void DoSomething()
{
Console.WriteLine("手機短信通知:中秋快樂");
}

}

  MSN通知插件:

public class PluginB : IPlugin
{

public void Initialize(IPluginHost pluginHost)
{
IPluginHost myApplication = (IPluginHost)pluginHost;
myApplication.AddMenuItem("Click me", OnClick);

}
private void OnClick(string name)
{
Console.WriteLine("Omg! You clicked me!");
}

public void DoSomething()
{
Console.WriteLine("MSN信息通知:中秋快樂");
}

}

  插件的目錄如下圖:

kkkyyy

  運行效果:

kkk444

  擴展性和兼容性:

  如果我想在主應用程序中添加一個ShowMessageBox方法。而且這個方法供插件調用。考慮到版本的兼容性,公開的接口是不能修改的。比如:將主應用程序的接口修改成:

public interface IPluginHost
{
void AddMenuItem(string name, MenuItemClickedHandler clickHandler);
void RegisterComponent<T>(T component) where T : class;
T GetComponent<T>() where T : class;
void MailNotice(string messaage);
void ShowMessageBox(string message);
}

  那么如何實現(xiàn)呢,很簡單,使用依賴注入的方式。添加下面接口:

public interface IMessageBoxHost
{
void ShowMessageBox(string message);
}

  通過主應用程序的構造函數(shù),將MessageBoxHost對下崗注入到主應用程序,在通過插件的構造函數(shù),將其注入插件之中。

  主應用程序的構造函數(shù):

public Program(IMessageBoxHost messageBoxHostInstance)
{
this.messageBoxHostInstance = messageBoxHostInstance;
}

  插件構造函數(shù):

public PluginA(IMessageBoxHost messageBoxHost)
{
this.messageBoxHost = messageBoxHost;
}

  修改實例化插件的代碼:

IPlugin plugin = (IPlugin)Activator.CreateInstance(pluginType, new object[] { messageBoxHostInstance });

  這樣我們對版本兼容有了保障。

  總結:本文閑談了可插拔應用程序的開發(fā)原理,文章的后面提供了插件和應用程序之間版本兼容的一種方案。有討論才有進步,歡迎各位留言。

  參考:A Flexible Plugin System    A more extensible way to build plugin system

NET技術.NET動態(tài)調用DLL的方法,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 激情小说激情图片激情视频 | 在线五月婷婷 | 亚色在线视频 | 中文字幕佐山爱一区二区免费 | 国产在线色视频 | 中文字幕视频一区 | 久久天天丁香婷婷中文字幕 | 亚洲九九 | 9l国产精品久久久久麻豆 | 四虎欧美永久在线精品免费 | 久久综合中文字幕一区二区三区 | 亚洲综合91社区精品福利 | 一区二区三区中文 | 精品免费国产一区二区三区 | 99伊人 | 伊人热热久久原色播放www | 四虎国产精品永久地址99 | 色爱区综合激月婷婷激情五月 | 91久久香蕉青青草原娱乐 | 99免费在线观看视频 | 好吊妞在线播放 | 色婷婷婷婷 | 91精品国产综合久久精品 | 蜜桃福利视频 | 日本精品久久久久中文字幕8 | 好吊妞操 | 91精品国产品国语在线不卡 | 97精品国产自在现线免费 | 亚洲第一网站 | 国语对白91 | 香蕉免费看一区二区三区 | 久久狠狠第一麻豆婷婷天天 | 福利国产视频 | 99视频精品全部国产盗摄视频 | 国产综合色精品一区二区三区 | 女人张腿给男人桶视频免费版 | 美国bbbbbbbbb免费毛片 | 黄 色 免 费 网站在线观看 | 欧美激情免费a视频 | 第一页欧美 | 中文字幕久久久久久精 |