win 7 64 bit Ultimate
vs2012 ultimate
以下是一個名為"MyCom.Class1"的com,以下是相關步驟:
- 以管理者身分打開VS2012
- 新增一個VB的類別庫 專案
- 專案-屬性-編譯,把【註冊COM Interop】打勾
- 在你的class前加上
<ComVisible(True)> <ProgId("MyCom.Class1")> _ <ClassInterface(ClassInterfaceType.AutoDual)> _
ComVissible<True>一定要加
Progid 可以不加,不加的話,使用Namespace,你的com名稱就會變成"Namespace name . class name"。
ClassInterfaceType可以用AutoDual,相關討論在此1 2 - 加完程式碼如下
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; }} }
- 專案-屬性- 簽署。打勾簽署組件,選擇強式金鑰。等一下註冊GAC會用到。
- 接著建置該專案,到bin\debug下可以看到兩個我們要使用的檔.dll和.tbl
這兩個檔需要部署我們的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
以下是成功畫面
如果要手動反安裝Interop介面
Regasm.exe com_two.dll /tlb:com_two.tlb /unregister - 接者我們寫一個簡單ASP來呼叫一下.net 做成的COM
<html> <body> <% Set strObj = Server.CreateObject("MyCom.Class1") Response.write strObj.getStr() %> </body> </html>
但很不幸的你收到一個錯誤,乍看好像是COM沒安裝好,但前面明明顯示安裝成功,這是因為你的 com是32位元,但網站在64bit OS下就會以64bit運作,因此你要調整應用程式集區可以執行32位元,參考這裡。
注意事項
- 若程式有修改,compile前要把站台停止,並重新安裝COM只要重新執行7 的兩個指令,最後再啟動站台。
- 你的com程式裡的function前不可加Shared,否則會在asp程式會收到找不到xxfunction的錯誤。
沒有留言:
張貼留言