2012年10月5日

在win7 64 bit以 vb.net/c#開發asp使用之com

我的開發環境:
win 7 64 bit Ultimate
vs2012 ultimate


以下是一個名為"MyCom.Class1"的com,以下是相關步驟:
  1. 以管理者身分打開VS2012
  2. 新增一個VB的類別庫 專案
    image
  3. 專案-屬性-編譯,把【註冊COM Interop】打勾
    image
  4. 在你的class前加上
    <ComVisible(True)>
        <ProgId("MyCom.Class1")> _
        <ClassInterface(ClassInterfaceType.AutoDual)> _



    ComVissible<True>一定要加


    Progid 可以不加,不加的話,使用Namespace,你的com名稱就會變成"Namespace name . class name"。


    ClassInterfaceType可以用AutoDual,相關討論在此1 2


  5. 加完程式碼如下

    vb




    Imports System
    Imports System.Collections.Generic
    Imports System.Text
    Imports System.Runtime.InteropServices
    
    <ComVisible(True)>
    <ProgId("MyCom.Class1")> _
    <ClassInterface(ClassInterfaceType.AutoDual)> _
    Public Class Class1
        Private _retStr As String = "Hi"
        Public Function getStr() As String
            Return _retStr
        End Function
    
    End Class



    c#




    using System; 
    using System.Runtime.InteropServices; 
    using System.Windows.Forms; 
    using VB6 = Microsoft.VisualBasic.Compatibility.VB6.Support; 
    
    namespace MyCom{
    
    [ComVisible(true)][ProgId("MyCom.Class1")][ClassInterface(ClassInterfaceType.AutoDual)]
    Private string _retStr= "Hi";
    public class Class1{
    
    public string  getStr(){
        return _retStr;
    }}
    }



  6. 專案-屬性- 簽署。打勾簽署組件,選擇強式金鑰。等一下註冊GAC會用到。

    image


  7. 接著建置該專案,到bin\debug下可以看到兩個我們要使用的檔.dll和.tbl

    image


    這兩個檔需要部署我們的asp才能讀得到,在部署之前先說明一下com_two.dll是.net的Assembly,這ASP是無法找得到,因此需要進行包裝成傳統DLL,所以要進行以下兩個動作:


    --把Assembly放到GAC, 以系統管理員打開visual studio的命令提示字元, 切到bin\debug執行以下指令


    gacutil /i com_two.dll


    --將.net包裝成Interop介面,並註冊型別庫(.tbl)


    Regasm.exe com_two.dll /tlb:com_two.tlb /register
    以下是成功畫面

    image




    如果要手動反安裝Interop介面
       
    Regasm.exe com_two.dll /tlb:com_two.tlb /unregister

  8.  
  9. 接者我們寫一個簡單ASP來呼叫一下.net 做成的COM



    <html>
    <body>
    <%
    Set strObj = Server.CreateObject("MyCom.Class1")
    Response.write strObj.getStr()
    
    %>
    </body>
    
    </html>



    但很不幸的你收到一個錯誤,乍看好像是COM沒安裝好,但前面明明顯示安裝成功,這是因為你的 com是32位元,但網站在64bit OS下就會以64bit運作,因此你要調整應用程式集區可以執行32位元,參考這裡


    image


注意事項


  1. 若程式有修改,compile前要把站台停止,並重新安裝COM只要重新執行7 的兩個指令,最後再啟動站台。
  2. 你的com程式裡的function前不可加Shared,否則會在asp程式會收到找不到xxfunction的錯誤。
參考



  1. 保哥


  2. Add COM-Visible Attributes


  3. 部署 Interop 應用程式


  4. Com Interop 的簡單介紹


  5. HOW TO:簽署組件 (Visual Studio)

沒有留言:

張貼留言