現在接觸一個需求,要使用一個網關接口實現短信發送,實現過程并不難,是使用[DllImport("*.dll")],但用ASP.NET調用別人寫好的DLL還是頭一次。看了一下COM和非托管代碼的介紹,搞的云里霧里反而更不知道自己要什么了,還是親自動手做一下就知道。
這網關有一個實現的例子:
程序代碼
[DllImport("MWGateway.dll")]//帳戶登陸
private static extern int MongateConnect(string ip, int port, string account, string pwd);
[DllImport("MWGateway.dll")]//發送單向信息
private static extern int MongateSendSms(int clientsock, string mobi, string note);
[DllImport("MWGateway.dll")]//測試連接
private static extern int MongateTestConn(int clientsock);
[DllImport("MWGateway.dll")]//查詢余額
private static extern int MongateQueryBalance(int clientsocket);
[DllImport("MWGateway.dll")]//查詢使用
private static extern int MongateQueryUsed(int clientsocket);
注意:以上代碼是可以放在ASP.NET頁面中直接運行的,但有個條件,就是那個MWGateway.dll文件得搞到%system32%目錄中,放在bin中不行,會提示說找不到模塊。
這直接帶來的問題是,沒辦法在服務器上部署,因為要服務器的%system32%中放入一個動態庫是很難做到的。
我查了一下,都說在ASP.NET2.0環境中是可以把DLL放在bin中的方式調用,但我實驗失敗了;如果是應用程序項目,要把DLL文件放在debug中,試了一下,確實可以。
換個角度去實現它:我先寫個類庫項目,這個類的功能就是“解釋”一下DLL中的方法,用ASP.NET調用這剛寫的類庫項目,就可以實現把DLL拷貝到Bin文件夾中完成調用了。在服務器上驗證了一下,每個應用程序池都可以運行獨立的DLL,并且互相無任何干擾。
這種方式有點像某種“包裝器”,和那個Runtime Callable Wrapper的思路近似。我的web應用程序的一部分可以連接到DLL,并且向上提供更多實用方法,設計模式中是叫接口模式。