在工作中遇到了在VB6.0的程序里要調(diào)用C#的Dll的問題,顯然這兩個開發(fā)環(huán)境屬于不同的平臺。在網(wǎng)上拜讀了幾位大師的文章后,在實際試驗中還是會發(fā)生這樣那樣的問題,最后還是實現(xiàn)了預期效果,在此我把我的實驗步驟和注意事項分享如下,希望對需要之人有所幫助:
實驗環(huán)境:
C#dll的創(chuàng)建使用的是VS2008;VB6.0
一、C#部分
1.用C#創(chuàng)建一個ClassLibrary項目(VS2008);
2.所有在VB6中要使用的方法都必須通過繼承接口實現(xiàn),并且為public的(非常重要,沒有繼承接口實現(xiàn)的方法,在VB6.0里面無法調(diào)用);
3.接口和類都需要加入屬性Guid;
Guid通過VS2008自帶的工具得到:
4.在VS2008的DOS命令工具提示框中運行:
sn -k C:\myKey.snk<回車>
在C盤根目錄下生成一個強名稱文件:myKey.snk(注意這個強名稱文件的名字可以自己定義,我暫定為myKey.snk)
5. 右擊項目,選擇屬性,打開并編輯項目的屬性對話框
在Application tab中,點擊Assembly Information按鈕,在打開的對話框中選中“make Assembly COM-Visible”(重要)
在Build Tab中,最好用Release模式編譯,確認選中“Make assembly COM-Visible”(重要)。
在Signing Tab中引入上一步創(chuàng)建的強名稱文件myKey.snk
6. 檢查項目的AssemblyInfo文件,ComVisible應設為true,項目和文件版本不為1.0.*,應該是一個具體的值;
7.編譯這個項目,生成dll文件。
到此為止,C#的Dll部分已經(jīng)準備完畢了。
二、VB6部分
1. VB6調(diào)用環(huán)境必須安裝.Net framework 2.0或以上版本,最好是3.5(和VS2008相同的framework);
2. 復制dll文件進入VB6環(huán)境的目標文件夾,例如D:根目錄, D:\TestCom.dll
3. 在Dos命令窗口用regasm命令注冊這個dll文件生成.tlb文件
regasm D:\TestCom.dll /tlb:D:\TestCom.tlb /codebase
在D:\將會生成一個TestCom.tlb文件
4.在Dos命令窗口用gacutil命令添加Dll文件到GAC中(全局程序集緩存),這樣這個Dll文件在這個PC中就可以隨處使用
gacutil /I D:\TestCom.dll
5.在VB6項目中,把生成的.tlb文件加入到項目(References)
6. VB6代碼即可調(diào)用tlb文件
Private Sub Command1_Click()
Dim obj As New t0426a.Class1
Form1.Label1.Caption = obj.GetString()
End Sub
注意:以上3,4步,需要在VB6環(huán)境的C:\WINDOWS\system32下面有相應的exe文件才可運行;第4步,可以省去;
還要說明的是,當轉(zhuǎn)移這個VB6生成的exe程序(這個VB6可執(zhí)行文件引用了C#的dll)到另外一臺電腦上的時候,需要把這個C# Dll文件一同Copy到那臺電腦上,并且重新執(zhí)行第3步的注冊生成tlb文件的工作,否則這個exe程序無法運行。