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

时间: 2024-10-14 21:47:11

COM与.NET的互操作(初级)的相关文章

[Android] 底部菜单布局+PopupWindows实现弹出菜单功能(初级篇)

    这篇文章主要是自己研究如何对底部菜单进行布局,并简单的实现点击不同"按钮"实现图片切换和背景切换的功能,最后通过PopupWindows实现弹出菜单,点击不同按钮能实现不同方法,相当于美图秀秀编辑图片的功能吧!它并没有涉及到Fragment碎片切换页面的功能,因为页面始终显示被处理的图片.这是我初学Android的一篇基础性文章和在线思想笔记,网上有很多更优秀的demo,不过也希望对大家有用~     首先介绍两种方法实现底部菜单点击不同图标显示选中状态的效果.    (可参考

AJAX初级应用-RSS无刷新聚合器的代码与下载

ajax|rss|刷新|无刷新|下载 rss.js[复制此代码]CODE:<!-- //控制ID function getId(objId){     return document.getElementById(objId) } //链接对应数组,请注明转载自http://www.cnrui.cn/blog function urlArrary(urlName){     switch(urlName){         case "clear":             re

Windows 2000 安全检查清单-初级篇

其实,Windows2000 含有很多的安全功能和选项,如果你合理的配置它们,那么windows 2000将会是一个很安全的操作系统. 具体清单如下: 初级安全篇 1.物理安全 服务器应该安放在安装了监视器的隔离房间内,并且监视器要保留15天以上的摄像记录.另外,机箱,键盘,电脑桌抽屉要上锁,以确保旁人即使进入房间也无法使用电脑,钥匙要放在另外的安全的地方. 2.停掉Guest 帐号 在计算机管理的用户里面把guest帐号停用掉,任何时候都不允许guest帐号登陆系统.为了保险起见,最好给gue

Web服务互操作开发的十大要点

web|web服务|web服务   Web服务互操作开发的十大要点 在过去一段时间里,很多供应商纷纷以惊人的速度发布其Web服务的实现.这包括产品的主要版本.辅助版本和许多开发服务包.随着新版本越来越符合标准,不同供应商之间的互操作性越来越高. 尽管如此,仍然需要在共同使用这些Web服务时的建议和策略.有些实践允许您确保以互操作的方式既使用又公开Web服务.基于已有的经验,我整理了关于Web服务互操作性的"十大"要点列表.有些要点基于在Microsoft上运行的测试结果的发现,另外一些

初级VPS入手一篇通

虽然我也是菜鸟但是还是没办法,因为今天给某人代购了一个VPS,但是呢这鸟人居然告诉我说不会用,被逼写了VPS的菜鸟教程:初级VPS入手一篇通.不敢保证什么,因为这里都是借用的别人的东西,但是看了这篇文章你至少在你的linuxVPS上简单的挂个小网站还是没问题的. 首先注册好VPS后必然会收到资料:一个是你在VPS供应商网站上面的用户名和密码(这个一般在你注册的时候自己填写,多数都是WHMCompleteSolution这家公司的杰作,以quickweb这家VPS商为例,参见图1),还有一个就是V

教你如何成为一名Java初级程序员

程序|程序员 目前,JAVA是开发人员的热宠,很多论坛都有不少热爱JAVA的开发人员,也有不少想成为JAVA程序员,但苦于不知道该如何学习,也不清楚该学些什么知识才能成为一个JAVA程序员.本人在这里抛砖引玉,和大家讨论成为一个JAVA初级程序员应该具有的知识,与大家共享. 个人认为想成为一个合格的JAVA初级程序员应该具备如下知识: 一.面向对象的知识:JAVA是一个面向对象的开发语言,因此熟悉面向对象对学习JAVA很有必要,您要了解:什么是对象,什么是类;什么是封装,什么是多态,什么是继承;

初级站长说“软文”

恩!今天来谈谈软文吧,还是老调调,我们有没有未来?坚持了才能知道,别人的非言非语一切都是纸飞机,能飞多远?能用什么威慑力?       我永远都是这样一个人,做什么没有结果我不会罢休,希望大家坚持下去!人要出名猪要壮站长的考虑一定要在重点上!而不是天天想着未来而不看看脚下的路,我很努力的做到自己该做的事,希望大家多多支持我,重点初级站长不是那么容易起来的也不是那么容易就沉沦在这茫茫的互联网大海的! 回到主题了,今天来谈谈SEO博客营销-软文,我不是个经验非常丰富的人,但是我个懂得观察事物的人,我

网站运营要尽量避免初级错误

错误|网站运营 通过与一些网站运营咨询用户的沟通,发现其中不少的人都或多或少的犯一些初级的错误,下面简单列出一些常见的初级错误,但愿对您能有所启发-- 初级错误一:存在内容空的栏目或页面 有些网站由于先期就已经构架好了网站的整个栏目,所以在有些栏目和页面还没有完成内容添加的时候,就匆匆推出,结果不少的栏目和页面内容稀少,或有的根本就没有内容. 这样的弊端是,网站的浏览者会非常失望,导致对网站的初步印象不佳,回访概率会大幅下降. 初级错误二:错误的链接或空链接 这种情况往往是由于网站的设计制作者或

七 CSS初级教程总结:属性结合起来使用

css|教程 如果你学完HTML初级教程即可学习CSS初级教程,使用CSS处理HTML样式. 下面的代码覆盖了初级教程的所有方面,保存下面的CSS文件并且在浏览器里观看连接的HTML,你可以明白各个CSS属性的用法.最好的学习方法就是理解作用在HTML上的CSS文件,改变CSS HTML会发生什么变化. body {font-family: arial, helvetica, sans-serif;font-size: 80%;color: black;background-color: #ff