最近项目中遇到一个需求,需要把之前采用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下载调用机制还在研究中。