在ASP中調用DLL的方法
.net的dll已經不是嚴格意義上的動態串連庫了,而是一個類或者類庫。它是不能直接在ASP、VB等其它的應用
環境中使用的。 我們可以通過COM封裝器(COM callable wrapper (CCW))來將.net的dll再次封裝,通過這個中間介質來實現相應的功能。
以下是一個小例子,供大家參考。
1. 在.net Visual Studio 中建立一個Class項目。
2. 在項目中新添加一個類,代碼如下:
using System;
namespace ClassLibrary1
{
//定義介面,這點很重要 (此介面中的方法與COM組件中的方法一致)
public interface iClass1
{
string test() ;
}
public class Class1 : iClass1
{
private string t = "";
//實現介面中的方法
public string test()
{
return "ok";
}
}
}
3.在.NET命令列視窗中,建立金鑰組。
可以用.net 內建的工具:sn.exe 來建立金鑰組。
如:SN –k testDll.Keys
4. 建立強命名程式集(Strong Name Assembly)
在AssemblyInfo.cs檔案中,添加[assembly: AssemblyKeyFile(@"c:"test.keys")]屬性
5. 編譯整個項目,產生ClassLibrary1.dll (此DLL可在 "bin"Debug 路徑下找到。)
6. 在.NET命令列視窗中,組建類型庫
tlbexp ClassLibrary1.dll /out:ClassLibrary1.tlb
7. 在.NET命令列視窗中,註冊裝配件
regasm /tlb:ClassLibrary1.tlb ClassLibrary1.dll
8. 在.NET命令列視窗中,將.NET裝配件安裝到全域裝配件緩衝(GAC)中
gacutil /i ClassLibrary1.dll
9. 在asp中測試
<%
SET s = CreateObject("ClassLibrary1.Class1")
Response.Write(s.test())
%>
-----------------------------------------------
動態聯結庫(DLL)可以加快應用程式關鍵區段的執行速度,同時通過統一的COM介面調用,對DLL的使用也可以最大限度地發揮組件的重用性。使用者不必關心DLL採用什麼語言編寫,只需關注其提供了哪些功能及介面參數,便可以為我所用。
目前,基於.Net技術編寫的DLL組件越來越多,而傳統的ASP中如果也可以應用這些組件提供的功能,可以避免很多程式員無謂的勞動。最近本人在工作中需要在ASP中調用.Net環境下產生的DLL,做過一些研究,特將自己的經驗共用出來。其實都是很簡單的東西,高手儘管嘲笑,呵呵~
1、在ASP中調用傳統的ActiveX DLL
要想讓COM能夠“看到”你的組件,必須先將組件註冊到註冊表中:
regsvr32 mydll.dll
然後在ASP中建立對象:
set mydll= server.createobject("mydll.method")
mydll.method
這樣就可以使用組件中的屬性和方法了。
2、在ASP中調用基於.Net開發的 DLL
關於組件註冊,一種方法是自動註冊,在vs.net2003或2005的IDE環境中可以實現COM組件的自動註冊,設定如下:項目名稱->右鍵"屬性"->配置屬性->產生->選中"為Com Interop註冊",編譯即可。
另一種方法是手動註冊:
進行命令列:轉換目前的目錄到:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
輸入命令: regasm mydll.dll /tlb:mydll.tlb /CodeBase
注意CodeBase的使用,如果你要註冊的.NET程式集沒有強式名稱的話,那麼在使用regasm註冊的時候就要加上/CodeBase。
註冊完畢,建立對象及使用方法與上面相同:
set mydll= server.createobject("mydll.method")
mydll.method
其實,不只是ASP,其他的COM程式(包括VBA、擴充預存程序等等)調用DLL的方法都是一樣的。
有關於regasm的參數,請參考:
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cptools/html/cpgrfassemblyregistrationtoolregasmexe.asp
裡面有兩個方法
Encrypt(string pToEncrypt,string sKey) //加密
Decrypt(string pToDecrypt,string sKey) //解密
然後你這樣寫代碼:
using System;
using System.Runtime.InteropServices;
namespace 名稱空間
{
// 首先建立介面,這個是Com必須使用的
[Guid("61BB24CB-4C2C-40f8-9E13-1AC5E558D56A")]
public interface IEncrypt
{
string Encrypt(string pToEncrypt,string sKey);
string Decrypt(string pToDecrypt,string sKey);
}
// 寫介面的實現
[Guid("CB52E990-185E-4448-A7E8-C88ECAD563AB")]
public class 類名稱 : IEncrypt
{
public string Encrypt(string pToEncrypt,string sKey)
{
// 複製FAQ加密代碼
}
public string Decrypt(string pToDecrypt,string sKey)
{
// 複製FAQ解密代碼
}
}
}
然後用vs.net打包成.dll類庫檔案,假設名稱為MyEncrypt.dll
然後用如下工具
regasm MyEnCrypt.dll /tlb:MyEncrypt.tlb
這個.tlb檔案就是類型庫,可以由vb6和vc++6引用。
注意上面的guid是使用vs.net工具菜單裡面的建立guid工具產生的。
還要注意,vs.net自動產生的assemblyinfo.cs檔案中必須添加強式名稱和版本號碼,因為Com組件需要版本號碼,不要改動版本號碼,也不要用vs.net自動的1.*這樣的版本號碼,最好使用
1.1.1.1這樣的固定版本,而且必須一次添加,不能多次添加。
步驟
一 產生.net程式集:
using System;
using System.IO;
using System.Text;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
namespace Csic
{
// 首先建立介面,這個是Com必須使用的
[Guid("61BB24CB-4C2C-40f8-9E13-1AC5E558D56A")]
public interface IEncrypt
{
string Encrypt(string pToEncrypt,string sKey);
string Decrypt(string pToDecrypt,string sKey);
}
// 寫介面的實現
[Guid("CB52E990-185E-4448-A7E8-C88ECAD563AB")]
public class Crypt : IEncrypt
{
public string Encrypt(string pToEncrypt,string sKey)
{
// 複製FAQ加密代碼
}
public string Decrypt(string pToDecrypt,string sKey)
{
// 複製FAQ解密代碼
}
}
}
把上面的檔案儲存成vs.net項目的一個類庫工程。
然後使用vs.net的“Vsitual Studio .Net工具”-->Vistual Studio .Net命令提示字元
在命令列內打下
cd c:" <斷行符號>
sn -k myKey.snk<斷行符號>
就在C盤根目錄下產生一個名叫myKey.snk的強式名稱檔案,然後關閉提示符視窗。
在vs.net的那個類庫工程自動產生的AssemblyInfo.cs檔案內把
[assembly: AssemblyKeyFile("")]
改成
[assembly: AssemblyKeyFile(@"C:"myKey.snk")]
把[assembly: AssemblyVersion("1.0.*")]
改成
[assembly: AssemblyVersion("1.0.0.0")] // 注意:這時你的Com組件版本為1.0.0.0版
然後按Shift + Ctrl + B鍵產生dll庫(使用Release模式),假設是Csic.Crypt.dll。
這時候,程式集就建立成功了。
二、註冊該程式集並建立一個類型庫
仍然使用開始菜單中的Vistual Studio .Net命令提示字元
進入你的項目目錄,假設為D:"myProject"bin"Release
在對話方塊中輸入
d:<斷行符號>
cd myproject"bin"release<斷行符號>
然後輸入 dir 命令可以看見Csic.Crypt.dll檔案
然後輸入:regasm /tlb :Csic.Crypt.tlb Csic.Crypt.dll<斷行符號>
然後就在這個目錄下產生了Csic.Crypt.tlb類型庫檔案。不要關閉此提示符視窗。
這時候,這個.dll的.net程式集就變成一個標準的Com組件了,但是還不能用,必須讓它變成全域Com組件。
這個regasm 公用程式將建立一個類型庫並在 Windows 註冊表中對其進行註冊,以使 PhysServer2.dll 中的類對 COM 用戶端可用 。
三、 將程式集添加到全域組件快取中
進入提示符視窗,輸入
gacutil /I Csic.Crypt.dll<斷行符號>
這時,你的這個dll就被複製到全域組件快取中了。也就是說無論在這個電腦的哪個硬碟上都可以使用此dll組件了。
四、使用方法
asp內的使用方法
set obj = Server.CreateObject("Csic.Crypt")
dim str1
str1 = obj.Encrypt("要加密內容","密碼") // 加密
dim str2
str2 = obj.Decrypt("要解密內容","密碼") // 解密