开发工具:vs2008
vs2008命令提示符(呵呵,这个你应该可以找到在什么地方吧)
附:本文适用任何vs系列工具。
在用c#创建com时,一定要记住以下几点:
1:所要导出的类必须为公有;
2:所有属性、方法也必须为公有;
3:要导出的属性、方法必须用接口方式;如果没有在接口中声明,即使该方法(属性)为公有,也不能正常导出到com。但他们可以被别的.net程序所使用;
4:所有的事件也必须用接口方式;
现在我们开始正题:
一、新建一个visual c#工程(习惯这种叫法了,现在应该叫解决方案)。
选择类型“类库”;我就叫mycom吧。
二、编写导出接口。
为了大家理解方便,我仅一加法操作举例。如下:
[guid("154bd6a6-5ab8-4d7d-a343-0a68ab79470b")]
public interface mycom_interface
{
[dispid(1)]
int add(int a, int b);
guid为全局唯一标识,可以用vs2008的命令提示符中输入:guidgen 就会出来它的窗口。在几个复选框选择最后一个registry format,点击new guid,然后copy就行了(以下如有guid的字符串,全部同样操作)
[dispid(1)]为函数的标识。如果有多个函数可相应的在函数前面加[dispid(2)], [dispid(3)]…
三、创建事件接口。
[guid("d11fea37-ac57-4d39-9522-e49c4f9826bb"),
interfacetype(cominterfacetype.interfaceisidispatch)]
public interface mycom_events
{
}
guid同二,不多说
interfacetype表求向com公开的方式,这里选择为以调度的方式向com公开。
四、创建具体类:
[guid("2e3c7bad-1051-4622-9c4c-215182c6bf58"),
classinterface(classinterfacetype.none),
comsourceinterfaces(typeof(mycom_events))]
public class class1 : mycom_interface
{
public int add(int a, int b)
{
return a + b;
}
}
至此,代码完毕。很简单吧。别急,后面来有常常被忽略的步骤,先把整体代码放在下面(注意引用interopservices):
using system;
using system.runtime.interopservices;
using system.text;
namespace mycom
{
[guid("154bd6a6-5ab8-4d7d-a343-0a68ab79470b")]
public interface mycom_interface
{
[dispid(1)]
int add(int a, int b);
}
[guid("d11fea37-ac57-4d39-9522-e49c4f9826bb"),
interfacetype(cominterfacetype.interfaceisidispatch)]
public interface mycom_events
{
}
[guid("2e3c7bad-1051-4622-9c4c-215182c6bf58"),
classinterface(classinterfacetype.none),
comsourceinterfaces(typeof(mycom_events))]
public class class1 : mycom_interface
{
public int add(int a, int b)
{
return a + b;
}
}
}
五、大家都知道com是需要注册的。
注册时要加密钥文件.snk。这一部就是生成snk文件。进入vs2008命令提示符。用命令:sn –k mycom.snk回车。我的在e:\vs2008\vc下面就生成了一个(mycom.snk)的文件。(你们可以根据自己的命令提示符所在的文件目录下去找)。然后把它copy到你的工程根目录下。
六、打开assemblyinfo.cs。
在里面加入[assembly:assemblykeyfile("mycom.snk")]
七、(1)项目属性->应用程序->程序集信息->选中“使程序集com可见”。(2)项目属性->生成->选中“为com互操作注册”。
八、生成。如果在debug下有一个mycom.tlb,那你就成功了(肯定还有mycom.dll)要此tlb文件是为了在vc6.0里面测试。
九、在vc里面建一个mfc对话框程序(当然console程序也一样,我为了看着方便)。建好后,把刚刚生成的mycom.tlb拷到你的根目录下。
十、选在代码里加入#import "mycom.tlb",然后编写核心测试代码:(我是在一个button1按钮里面添加的),如下:
void ctestdlg::onbutton1()
{
coinitialize(null);//注意初始化
mycom::mycom_interfaceptr p(__uuidof(mycom::class1));//创建智能指针
mycom::mycom_interface *s = p;
int a = 3;
int b = 6;
int c = s->add(a,b);
cstring str;
str.format("%d",c);
messagebox(str);
}
当弹出一个9,就说明你已经成功了。
您可能感兴趣的文章:
如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!
网友评论