一、关于Com组件
COM component(COM组件)是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境下;COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块。
COM是开发软件组件的一种方法。组件实际上是一些小的二进制可执行程序,它们可以给应用程序,操作系统以及其他组件提供服务。开发自定义的COM组件就如同开发动态的,面向对象的API。多个COM对象可以连接起来形成应用程序或组件系统。并且组件可以在运行时刻,在不被重新链接或编译应用程序的情况下被卸下或替换掉。Microsoft的许多技术,如ActiveX, DirectX以及OLE等都是基于COM而建立起来的。并且Microsoft的开发人员也大量使用COM组件来定制他们的应用程序及操作系统。 COM所含的概念并不止是在Microsoft Windows操作系统下才有效。COM并不是一个大的API,它实际上像结构化编程及面向对象编程方法那样,也是一种编程方法。在任何一种操作系统中,开发人员均可以遵循“COM方法”。 一个应用程序通常是由单个的二进制文件组成的。当编译器生成应用程序之后,在对下一个版本重新编译并发行新生成的版本之前,应用程序一般不会发生任何变化。操作系统,硬件及客户需求的改变都必须等到整个应用程序被重新生成。 目前这种状况已经发生变化。开发人员开始将单个的应用程序分隔成单独多个独立的部分,也即组件。这种做法的好处是可以随着技术的不断发展而用新的组件取代已有的组件。此时的应用程序可以随新组件不断取代旧的组件而渐趋完善。而且利用已有的组件,用户还可以快速的建立全新的应用。 传统的做法是将应用程序分割成文件,模块或类,然后将它们编译并链接成一个单模应用程序。它与组件建立应用程序的过程(称为组件构架)有很大的不同。一个组件同一个微型应用程序类似,即都是已经编译链接好并可以使用的二进制代码,应用程序就是由多个这样的组件打包而得到的。单模应用程序只有一个二进制代码模块。自定义组件可以在运行时刻同其他的组件连接起来以构成某个应用程序。在需要对应用程序进行修改或改进时,只需要将构成此应用程序的组件中的某个用新的版本替换掉即可。 COM,即组件对象模型,是关于如何建立组件以及如何通过组件建立应用程序的一个规范,说明了如何可动态交替更新组件。
二、vs2010创建com组件
?//打开vs2010 新建一个类库项目ComTest
//新建一个加法的接口IComTest,代码如下:
//在用C#创建COM组件时,一定要记住以下几点:
//1:所要导出的类必须为公有;
//2:所有属性、方法也必须为公有;
//3:要导出的属性、方法必须用接口方式;如果没有在接口中声明,即使该方法(属性)为公有,也不能正常导出到COM。但他们可以被别的.NET程序所使用;
//可以用VS2010的命令提示符中输入:guidgen 就会出来它的窗口。在几个复选框选择最后一个Registry Format,点击New Guid,然后COPY就行
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//因为Guid是属性,应该用的是System.Runtime.InteropServices.GuidAttribute而不是System.Guid
using System.Runtime.InteropServices;
namespace ComTest
{
[Guid("C3FE262B-5831-484c-BDF1-05AAFFF8F862")]
public interface IComTest
{
[DispId(1)]//[DispId(1)]为函数的标识。如果有多个函数可相应的在函数前面加[DispId(2)].....
int Add(int a, int b);
[DispId(2)]
string HelloWord(string name);
}
//InterfaceType表求向COM公开的方式,这里选择为以调度的方式向COM公开
[Guid("D11FEA37-AC57-4d39-9522-E49C4F9826BB"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
//创建事件接口
public interface IComTest_Events
{
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//因为Guid是属性,应该用的是System.Runtime.InteropServices.GuidAttribute而不是System.Guid
using System.Runtime.InteropServices;
namespace ComTest
{
[Guid("2E3C7BAD-1051-4622-9C4C-215182C6BF58"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IComTest_Events))]
public class ComTest : IComTest//接口实现类
{
public int Add(int a, int b)
{
return a + b;
}
public string HelloWord(string name)
{
return "你好"+name;
}
}
}
至此,代码就OK了。
由于COM需要注册,注册时要加密钥文件.SNK,下面我们说下如何生成.snk文件
进入VS2010命令提示符。用命令:sn –k ComTest.snk回车(注意:以管理员身份运行)
这是命令提示符的路径:C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC
相应生成的文件就在vc文件夹下面。将其考到项目根目录下。
打开AssemblyInfo.cs。在里面加入[assembly:AssemblyKeyFile("ComTest.snk")]
[assembly: ComVisible(false)] 修改为true。
项目属性->生成->选中“为COM互操作注册
生成(*^__^*) OK
下面看下客户端利用js调用com组件
代码如下:
?<html>
<body>
<object classid="clsid:2E3C7BAD-1051-4622-9C4C-215182C6BF58" id="MyComTest" width="286" height="225">
</object>
<script language="JavaScript">
<!--
var wmp;
wmp = document.getElementById("MyComTest");
//var iResult=wmp.Add(4,9);
//alert(iResult);
var iResult=wmp.HelloWord("wanghk");
alert(iResult);
</script>
</body>
</html>
COM component(COM组件)是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境下;COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块。
COM是开发软件组件的一种方法。组件实际上是一些小的二进制可执行程序,它们可以给应用程序,操作系统以及其他组件提供服务。开发自定义的COM组件就如同开发动态的,面向对象的API。多个COM对象可以连接起来形成应用程序或组件系统。并且组件可以在运行时刻,在不被重新链接或编译应用程序的情况下被卸下或替换掉。Microsoft的许多技术,如ActiveX, DirectX以及OLE等都是基于COM而建立起来的。并且Microsoft的开发人员也大量使用COM组件来定制他们的应用程序及操作系统。 COM所含的概念并不止是在Microsoft Windows操作系统下才有效。COM并不是一个大的API,它实际上像结构化编程及面向对象编程方法那样,也是一种编程方法。在任何一种操作系统中,开发人员均可以遵循“COM方法”。 一个应用程序通常是由单个的二进制文件组成的。当编译器生成应用程序之后,在对下一个版本重新编译并发行新生成的版本之前,应用程序一般不会发生任何变化。操作系统,硬件及客户需求的改变都必须等到整个应用程序被重新生成。 目前这种状况已经发生变化。开发人员开始将单个的应用程序分隔成单独多个独立的部分,也即组件。这种做法的好处是可以随着技术的不断发展而用新的组件取代已有的组件。此时的应用程序可以随新组件不断取代旧的组件而渐趋完善。而且利用已有的组件,用户还可以快速的建立全新的应用。 传统的做法是将应用程序分割成文件,模块或类,然后将它们编译并链接成一个单模应用程序。它与组件建立应用程序的过程(称为组件构架)有很大的不同。一个组件同一个微型应用程序类似,即都是已经编译链接好并可以使用的二进制代码,应用程序就是由多个这样的组件打包而得到的。单模应用程序只有一个二进制代码模块。自定义组件可以在运行时刻同其他的组件连接起来以构成某个应用程序。在需要对应用程序进行修改或改进时,只需要将构成此应用程序的组件中的某个用新的版本替换掉即可。 COM,即组件对象模型,是关于如何建立组件以及如何通过组件建立应用程序的一个规范,说明了如何可动态交替更新组件。
二、vs2010创建com组件
?//打开vs2010 新建一个类库项目ComTest
//新建一个加法的接口IComTest,代码如下:
//在用C#创建COM组件时,一定要记住以下几点:
//1:所要导出的类必须为公有;
//2:所有属性、方法也必须为公有;
//3:要导出的属性、方法必须用接口方式;如果没有在接口中声明,即使该方法(属性)为公有,也不能正常导出到COM。但他们可以被别的.NET程序所使用;
//可以用VS2010的命令提示符中输入:guidgen 就会出来它的窗口。在几个复选框选择最后一个Registry Format,点击New Guid,然后COPY就行
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//因为Guid是属性,应该用的是System.Runtime.InteropServices.GuidAttribute而不是System.Guid
using System.Runtime.InteropServices;
namespace ComTest
{
[Guid("C3FE262B-5831-484c-BDF1-05AAFFF8F862")]
public interface IComTest
{
[DispId(1)]//[DispId(1)]为函数的标识。如果有多个函数可相应的在函数前面加[DispId(2)].....
int Add(int a, int b);
[DispId(2)]
string HelloWord(string name);
}
//InterfaceType表求向COM公开的方式,这里选择为以调度的方式向COM公开
[Guid("D11FEA37-AC57-4d39-9522-E49C4F9826BB"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
//创建事件接口
public interface IComTest_Events
{
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//因为Guid是属性,应该用的是System.Runtime.InteropServices.GuidAttribute而不是System.Guid
using System.Runtime.InteropServices;
namespace ComTest
{
[Guid("2E3C7BAD-1051-4622-9C4C-215182C6BF58"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IComTest_Events))]
public class ComTest : IComTest//接口实现类
{
public int Add(int a, int b)
{
return a + b;
}
public string HelloWord(string name)
{
return "你好"+name;
}
}
}
至此,代码就OK了。
由于COM需要注册,注册时要加密钥文件.SNK,下面我们说下如何生成.snk文件
进入VS2010命令提示符。用命令:sn –k ComTest.snk回车(注意:以管理员身份运行)
这是命令提示符的路径:C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC
相应生成的文件就在vc文件夹下面。将其考到项目根目录下。
打开AssemblyInfo.cs。在里面加入[assembly:AssemblyKeyFile("ComTest.snk")]
[assembly: ComVisible(false)] 修改为true。
项目属性->生成->选中“为COM互操作注册
生成(*^__^*) OK
下面看下客户端利用js调用com组件
代码如下:
?<html>
<body>
<object classid="clsid:2E3C7BAD-1051-4622-9C4C-215182C6BF58" id="MyComTest" width="286" height="225">
</object>
<script language="JavaScript">
<!--
var wmp;
wmp = document.getElementById("MyComTest");
//var iResult=wmp.Add(4,9);
//alert(iResult);
var iResult=wmp.HelloWord("wanghk");
alert(iResult);
</script>
</body>
</html>