vb調用C#寫的dll

在做系統升級維護的項目中,用到了老系統(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編寫時添加額外的代碼。

---------------------------------------------------------------------------------------------------------------

 

引用鏈接:

http://blog.csdn.net/TheRule/archive/2006/04/28/694756.aspx

http://space.itpub.net/186726/viewspace-448770

發佈了46 篇原創文章 · 獲贊 16 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章