|
| |
名片设计 CorelDRAW Illustrator AuotoCAD Painter 其他软件 Photoshop Fireworks Flash |
|
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) |
| 快精灵印艺坊 版权所有 |
首页 |
||