最近項目中遇到一個需求,需要把之前採用VB.NET開發的WINDOWS EXE程序轉化成採用WEB方式調用運行,之前一下就想到了VB6中開發ocx控件的方式實現,但由於把現有.net應用轉變爲vb6應用需要的工作量比較大,考慮是否可以直接用.net平臺轉換,從而採用了把現有工程轉變爲.net的windows控件工程然後在轉變成COM控件的形式。由.net的exe轉變爲.net的windows控件比較容易,代碼變動不大,在轉變爲COM時採用了microsoft提供的以下方式:
更新:2007 年 11 月
ComClassAttribute 屬性指示編譯器添加允許類作爲 COM 對象公開的元數據。
<System.AttributeUsage(System.AttributeTargets.Class, _ Inherited := False, AllowMultiple := False)> _ Public NotInheritable Class ComClassAttribute Inherits System.Attribute
使用 ComClassAttribute 來簡化從 Visual Basic 公開 COM 組件的過程。COM 對象與 .NET Framework 程序集差別很大,如果沒有 ComClassAttribute,則從 Visual Basic 生成 COM 對象需要經過很多步驟。對於標記爲 ComClassAttribute 的類,編譯器會自動執行這些步驟中的許多步驟。
說明: |
---|
1、此屬性簡化 COM 對象的創建過程。若要將類作爲 COM 對象進行公開,必須使用在“配置屬性”對話框的“生成”區域中選擇的“註冊 COM Interop”選項來編譯項目。 |
說明: |
---|
雖然還可以將用 Visual Basic 創建的類作爲 COM 對象進行公開以供非託管代碼使用,但它並不是真正的 COM 對象。有關詳細信息,請參見 .NET Framework 應用程序中的 COM 互操作性。 |
若要運行本示例,請創建一個新的 Class Library 應用程序,然後將下面的代碼添加到類模塊中。
2、修改AssemblyInfo.vb文件
'The following GUID is for the ID of the typelib if this project is exposed to COM 在AssemblyInfo.vb文件中註釋掉上面一行
|
3、修改ComClass1控件類文件
<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _ Public Sub New() Function AddNumbers(ByVal X As Integer, ByVal Y As Integer) |
引用:http://msdn.microsoft.com/zh-cn/vbasic/57kx88c8.aspx
4、編譯工程
5、測試成果
採用這種方式即可把現有的vb.net寫的windows控件工程封裝爲COM組件
然後編寫一個測試html進行調用
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>TEST COM</title> </head> <body> <form id="form1" runat="server"> <div> <object classid="clsid:7666AC25-855F-4534-BC55-27BF09D49D46" ></object> </div> </form> </body> </html> |
即可實現調用,對於目前如何打包封裝現有COM dll,實現類似於OCX下載調用機制還在研究中。