分享
 
 
 

COM与.NET的互操作(初级)

王朝c#·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

COM与.NET的互操作(初级)

COM与.NET的互操作中从.NET调用COM组件,如果使用VS.NET将变得非常容易,你只需要在你的工程中,添加对应的COM引用,编译工具就在后台悄悄的把COM“变成”了.NET程序集。而从传统的语言调用调用.NET组件却不如那么方便了。所以,我整理了个人调试成功的几段程序希望对大家有一些帮助,好了废话少说进入正题。

一,从vbscript等脚本调用.net组件

首先我们可以写一个.NET dll如下

//the first file:netServer.cs

using System;

using System.Reflection;

using System.Runtime.InteropServices;

[assembly: AssemblyKeyFile("key.snk")]

namespace CSharpServer

{

//缺省的是ClassInterfaceType.AutoDispatch,该方式下只生成dispatch接口

//只能被使用script、VB等late binding方式的COM客户使用

[ClassInterfaceAttribute(ClassInterfaceType.AutoDual)]

public class SharpObject

{

private string m_strName;

public SharpObject(){}

public string Name //Property: Name, Get/Set

{

get { return m_strName; }

set { m_strName = value; }

}

}

}

//the second file: test.vbs

Dim obj

Set obj = CreateObject("CSharpServer.SharpObject")

obj.Name = "Chang Ming"

MsgBox "My Name is " & obj.Name

对这两个文件按如下方式编译,为了清晰起见我们使用命令行工具(命令行工具环境可以从开始——>Microsoft Visual Studio .NET——>Visual Studio .NET 工具——>Visual Studio .NET 命令提示中进入)

1,生成密钥文件,用于给程序集强名称签名

sn -k key.snk

2,使用强名称签名,编译成类库,

csc /t:library netserver.cs

3,生成类型库

tlbexp netserver.dll /out:netserver.tlb

4,注册dll

regasm netserver.dll

5,移入gac全局程序集缓存

gacutil -i netserver.dll

6,调用测试脚本

wscript test.vbs

在这里有几个需要注意的地方,1,必须要给程序集签名,让它具有强名称。2,必须将使用regasm注册程序集,它将会在注册表中添加相应的项。3,必须将签名后的强名称程序集移入全局程序集缓存(gac)。4,必须要先安装scriptengine了,微软的脚本执行引擎。这是从脚本调用.net 程序集了,呵呵,很简单吧?J

二,从C/C++调用.NET组件

还是一段程序,呵呵,程序就是我的生命:)

//file1 name:netServer.cs

using System;

using System.Reflection;

using System.Runtime.InteropServices;

[assembly: AssemblyKeyFile("key.snk")]

namespace CSharpServer

{

public interface IObject //声明接口

{

double Sub(double c,double d);

}

//[ClassInterfaceAttribute(ClassInterfaceType.AutoDual)]

public class SharpObject:IObject

{

private string m_strName;

public SharpObject(){}

public string Name //Property: Name, Get/Set

{

get { return m_strName; }

set { m_strName = value; }

}

public double Add(double a,double b)

{

Console.WriteLine("the answer is {0}",a+b);

return a+b;

}

public double Sub(double c,double d) //实现接口方法

{

Console.WriteLine("the answer is {0}",c-d);

return c-d;

}

}

}

//file2 name: comclient.cpp

#include <windows.h>

#include <stdio.h>

#include <iostream.h>

#pragma warning (disable: 4278)

#import "netServer.tlb" no_namespace named_guids

int main(int argc, char* argv[])

{

IObject *cpi = NULL;

int retval = 1;

// Initialize COM and create an instance of the InterfaceImplementation class:

CoInitialize(NULL);

HRESULT hr = CoCreateInstance(CLSID_SharpObject,

NULL,

CLSCTX_INPROC_SERVER,

IID_IObject,

reinterpret_cast<void**>(&cpi));

if (FAILED(hr))

{

printf("Couldn't create the instance!... 0x%x\n", hr);

}

else

{

printf("Calling function.\n");

retval = 0;

cout<<"10-4="<<cpi->Sub(10,4)<<endl;

printf("Returned from function.\n");

cpi->Release();//释放com对象

}

// Be a good citizen and clean up COM:

CoUninitialize();

return retval;

}

编译方法还是如前

1,生成密钥文件,用于给程序集强名称签名

sn -k key.snk

2,使用强名称签名,编译成类库,

csc /t:library netserver.cs

3,生成类型库 //这一步很重要

tlbexp netserver.dll /out:netserver.tlb

4,注册dll

regasm netserver.dll

5,移入gac全局程序集缓存

gacutil -i netserver.dll

6,编译测试程序

cl COMClient.cpp

7,执行comclient.exe

说明:

在c/c++中调用com要麻烦一些,首先要调用COM库函数CoInitialize(NULL);进行初始化,然后调用HRESULT hr = CoCreateInstance(CLSID_SharpObject,

NULL,

CLSCTX_INPROC_SERVER,

IID_IObject,

reinterpret_cast<void**>(&cpi));

其中CLSID_SharpObject是SharpObject类(com类)的类ID它是由工具生成的用来唯一标识SharpObject类,IID_IObject唯一标识IObject接口,如果CoCreateInstance成功的创建了COM对象,那么FAILED(hr)将为false,得到com对象的指针后,就可以用它调用com对象中的方法了.

欢迎喜欢COM和.NET的兄弟姐妹和我讨论,MSN: tlping@msn.com

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有