快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

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

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对象中的方式了.





返回类别: 教程
上一教程: .net的4个基本概念
下一教程: .NET的自动序列号工具

您可以阅读与"COM与.NET的互操作(初级)"相关的教程:
· COM和.NET的互操作
· .NET组件和COM组件之间的相互操作
· .NET框架程序设计读书笔记(三)--.net框架类库(FCL)和通用类型系统、代码互操作
· .Net的注册表操作
· ASP.NET中数据库的操作初步(1)
    微笑服务 优质保证 索取样品