c#创建vc可调用的com组件方法分享

所属分类: 软件编程 / C#教程 阅读数: 77
收藏 0 赞 0 分享

开发工具: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,就说明你已经成功了。

更多精彩内容其他人还在看

C#使用oledb读取excel表格内容到datatable的方法

这篇文章主要介绍了C#使用oledb读取excel表格内容到datatable的方法,涉及C#操作oledb及datatable的相关技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#使用oledb操作excel文件的方法

这篇文章主要介绍了C#使用oledb操作excel文件的方法,涉及C#中oledb操作excel的相关技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#使用IHttpModule接口修改http输出的方法

这篇文章主要介绍了C#使用IHttpModule接口修改http输出的方法,涉及C#操作IHttpModule接口的相关技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#给图片加水印的简单实现方法

这篇文章主要介绍了C#给图片加水印的简单实现方法,涉及C#操作图片的相关技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#生成随机数的方法小结

这篇文章主要介绍了C#生成随机数的方法,实例总结了C#生成随机数的相关技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#使用jQuery实现无刷新评论提交的方法

这篇文章主要介绍了C#使用jQuery实现无刷新评论提交的方法,涉及C#结合jQuery进行Ajax操作的相关技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#读取中文文件出现乱码的解决方法

这篇文章主要介绍了C#读取中文文件出现乱码的解决方法,涉及C#中文编码的操作技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#图像对比度调整的方法

这篇文章主要介绍了C#图像对比度调整的方法,涉及C#实现图像对比度操作的相关技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#图像灰度级拉伸的方法

这篇文章主要介绍了C#图像灰度级拉伸的方法,涉及C#灰度操作的相关技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#图像线性变换的方法

这篇文章主要介绍了C#图像线性变换的方法,涉及C#操作图像线性变换的相关技巧,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多