在做系統升級維護的項目中,用到了老系統(VB實現)要調用一部分新功能(C#實現)的情況,於是進行了簡單的調查。發現如下資料
網上發現的資料。
---------------------------------------------------------------------------------------------------------------
裏面有兩個方法
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程序集:
首先你把http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=35935的代碼複製。
然後你複製這個代碼
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("要解密內容","密碼") // 解密
---------------------------------------------------------------------------------------------------------------
資料中寫的,按照他做就能夠實現,但是對於VB不太熟悉的人來說,遇到了一點問題,所以個人總結一下:
1,上面資料的第三步三、 將程序集添加到全局程序集緩存中 後,要在VB項目中添加tlb文件的引用
選中相應工程--〉工程--〉引用追加--〉生成的DLL上打勾
2,使用方法,除了set obj = Server.CreateObject("Csic.Crypt")外,還可以使用如下方法:
Dim a As New ComTest
str1 = a.Encrypt("要加密內容","密碼") // 加密
3,關於Com組件的生成,下面的描述有些複雜,有如下簡單點的方法:
---------------------------------------------------------------------------------------------------------------
1、先選擇"文件"--> -->"新建"-->"項目"-->"類庫"
我在這取名TestVB,代碼如下:
using System;
using System.Collections.Generic;
using System.Text;
namespace TestVB
{
public class Test
{
public string testEcho()
{
return "test1";
}
}
}
2、編譯此項目前,先設置"項目"-->"TestVB屬性"-->"生成"下的"爲COM Interop 註冊"打上勾,原有AssemblyInfo.cs文件中的"[assembly: ComVisible(false)]"修改爲"[assembly: ComVisible(true)]"保存,編譯即可 (這兒纔是重點,第一個資料沒有涵蓋)
3、把生成的DLL文件拷貝到VB開發機器上(該機器需安裝相應的.NET框架),運行Regasm /tlb /codebase $DLL_DIR/TestVB.dll 命令註冊該DLL文件,在VB新建項目中引用TestVB.tlb即可在vb中調用DLL中的函數。測試代碼如下:
Private Sub Command1_Click()
Dim a As New Test
MsgBox a.testEcho
End Sub
4、以上是測試代碼,僅考慮了是否正確調用函數,假使想讓VB調用.net DLL時顯示提示該類中的方法等,需要在DLL編寫時添加額外的代碼。
---------------------------------------------------------------------------------------------------------------
引用鏈接: