//打開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
----制作安裝文件(略)----
---打包制作cab(略)-------
下面看下客戶端利用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>
