Com与.Net互操作

Com与.Net互操作


  .Net调用Com组件主要分为两类:静态调用及动态调用。所谓静态调用:指通过tlbimp.exe命名产生Com组件在.Net环境下的包装类,然后通过这个包装类来访问Com组件。所谓动态调用:是指不通过Com组件的包装类来进行Com组件调用,而是在远行时通过反射来进行Com组件调用。

下面将分别详细的讨论这两种实现方法:

静态调用

1、  编写Com组件MyComponent.dll

2、  产生可访问Com组件的包装类:

tlbimp /out:Interop.MyComponent.dll MyComponent.dll

3、  在.Net代码中访问

只要在项目添加Com包装类,就可以像访问.Net的装配件一样访问Com组件。

当然上面的三个步骤也可以在VS中直接添加对Com组件的引用,让VS自动完成第二步。

注意:

1、 
如果引用Com组件的.Net项目为结果为强命名组件,这个时候要求Com组件的包装类也必须为强命名组件,所以这个时候必须手动进行第二步操作,并且在产生包装类的时候设置snk文件名称,具体操作方法为:

tblimp /keyfile:filename.snk /out:Interop.MyComponent.dll MyComponent.dll

2、  要想有更多的设置请参考tlbimp的使用方法。

动态调用

1、  编写Com组件MyComponent.dll。

2、  在.Net程序中产生要被调用的Com组件类的Type:

Type comType = Type.GetTypeFromCLSID( Guid ); 或

Type comType = Type.GetTypeFromProgID( string );

3、  生成Com组件类对象

object comObj = Activator.CreateInstance( comType ); 或

object comObj = comType.InvokeMember(null,

BindingFlags.DeclaredOnly |

BindingFlags.Public | BindingFlags.NonPublic |

BindingFlags.Instance | BindingFlags.CreateInstance,

null, null, args );

4、  设置参数及其对应的ByRef属性。

object[] args = new object[]{arg1, arg2 , …,argn};

ParameterModifier[] modifiers = new ParameterModifier[1];

modifiers[0] = new ParameterModifier( argNumCount );

//设置参数是否为ByRef

modifiers[0][0] = true;//表示该参数是ByRef(InOut/Out)

modifiers[0][n] = false;//表示该参数是ByValue(In)。

5、  调用Com组件方法或者属性。

object returnValue = comType.InvokeMember(

“MethodName”,indingFlags.InvokeMethod,null , comObj ,args ,modifiers
,null );

注意:

1、 
调用Com组件方法的时候,不能够采用MethodInfo的方式进行调用,由于没有Com组件的源数据信息,不能通过Type.GetMethod等方法够获取与Com组件相关的任何特有类型信息。

2、 
动态调用Com组件方法中,如果需要参数回传值,则必须将该参数对应的ParameterModifier表示设置为True,即使该参数类型为传址类型。(在.net中如果参数为传址类类型,那么参数默认行为是ByRef的)。

c#创建组件

a)        
工程属性→应用程序→程序集信息→勾选“使程序集COM可见”

b)         工程属性→生成→勾选“为COM互操作注册”

c)         不能使用静态类、静态方法

d)         参数仅使用基本类型,如string、int

注册装配件 RegAsm /codebase MyService.dll

注意:/codebase是指设置注册表中的基本代码,也就是记录下dll的路径,供ccw在Com客户端在任何位置都可以找到该dll,如果没有/codebase属性,则默认为dll在Com客户端执行程序的当前目录下面。

工具用法:

将COM对象转换为.NET程序集

//TlbImp.exe /out:Interop.XX.DLL /namespace:Interop.XX

将普通dll导出为TXT文件

//dumpbin.exe /exports xx.dll >file.txt

Com与.Net互操作,布布扣,bubuko.com

时间: 2024-10-18 06:03:06

Com与.Net互操作的相关文章

CUDA与OpenGL互操作

当处理较大数据量的时候,往往会用GPU进行运算,比如OpenGL或者CUDA.在实际的操作中,往往CUDA实现并行计算会比OpenGL更加方便,而OpenGL在进行后期渲染更具有优势.由于CUDA中的运算结果存储在GPU中,如果将数据download到CPU,然后再将CPU中的数据上传到GPU,使用OpenGL进行渲染,中间的GPU与CPU的交互会很耗时,毕竟使用GPU的目的就是为了加速,这样的数据传输会降低效率. 接下来简要说一下如何使CUDA和OpenGL互操作来实现GPU中数据的交互传输,

快学Scala 第五课 (构造映射,获取映射值,更新映射值,迭代映射,与Java互操作)

构造映射: val score = Map[String, Int]() val score1 = HashMap[String, Int]() val value1 = Map[String, Int]("aa" -> 1, "bb" -> 2) val value2 = Map[String, Int](("aa", 1), ("bb", 2)) 获取映射值: println(if(value2.contain

Android中Fragment和Activity之间的互操作代码例子

摘要 本文介绍了Android中一个Activity中有多个Fragment的情况下,Fragment之间如何通过Activity进行互操作. 源代码 源代码地址为:http://download.csdn.net/detail/logicteamleader/8931199 源代码使用ADT编写,ADT版本为2014,Android版本为android-22. 技术要点 1.在Activity中的多个Fragment之间要互操作,一定要通过此Activity,不能直接通信: 2.在Activi

ylbtech-LanguageSamples-ComInteropPart2(COM 互操作第二部分)

ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-ComInteropPart2(COM 互操作第二部分) 1.A,示例(Sample) 返回顶部 “COM 互操作第二部分”示例 本示例演示了如何将 C# 服务器与 C++ COM 客户端一起使用. 注释 您必须具有管理员权限才能运行此程序,并且必须安装了 Visual C++ 才能编译此示例. 安全说明 提供此代码示例是为了阐释一个概念,它并不代表最安全的编码实践,因此不应在应用程序

ylbtech-LanguageSamples-COMInteropPart1(COM 互操作 - 第一部分)

ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-COMInteropPart1(COM 互操作 - 第一部分) 1.A,示例(Sample) 返回顶部 “COM 互操作 - 第一部分”示例 本示例演示了 C# 程序如何能够与非托管 COM 组件进行互操作. 安全说明 提供此代码示例是为了阐释一个概念,它并不代表最安全的编码实践,因此不应在应用程序或网站中使用此代码示例. 对于因将此代码示例用于其他用途而发生的偶然或必然损害,Micr

AnyCAD C++ SDK与OpenCASCADE互操作

AnyCAD SDK有.Net和C++两个版本,使用C++版本的AnyPlatformOcc模块可以实现与OpenCASCADE互操作. C++版本(VS2010 32bit)下载 在AOBridge.h中定义了转换API: namespace AnyCAD { namespace API{   class AnyPlatformOcc_API AOBridge   {   public:      static TopoShape Convert(const TopoDS_Shape& sha

错误 1 无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”。请改用适用的接口

http://www.cnblogs.com/waitingfor/archive/2011/12/19/2293469.html 错误 1 无法嵌入互操作类型"Microsoft.Office.Interop.Excel.ApplicationClass".请改用适用的接口,码迷,mamicode.com 错误 1 无法嵌入互操作类型"Microsoft.Office.Interop.Excel.ApplicationClass".请改用适用的接口

ylbtech-LanguageSamples-OfficeSample(COM 互操作)

ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-OfficeSample(COM 互操作) 1.A,示例(Sample) 返回顶部 本示例演示如何使用称为“COM 互操作”.“省略 ref”.“索引属性”.“命名参数”和“可选参数”的 C# 4.0 功能来创建与 Microsoft Office 进行通信的 C# 应用程序. 传统上,为了访问 Word.Excel 等 Microsoft Office 应用程序,C# 开发人员不得不

Flex与.NET互操作(六):Flex和.NET协同开发利器FluorineFx

在本系列前面几篇文章中分别介绍了通过WebService.HTTPService.URLLoader以及FielReference等组件或类来完成Flex与.NET服务端的通信的相关知识点.通过这些方式来完成与服务端的通信是非常方便和简单的,但有他的缺点就是通信数据量较小,如要传输大量的数据或是实现不同对象的序列化传输,它们则满足不了我们的需求,需要寻找另外一种通信协议,另一种高效的传输协议来代替SOAP协议传输的方案,那便是AMF(ActionScript Message Format)协议.

[转]Go与C语言的互操作

Go有强烈的C背景,除了语法具有继承性外,其设计者以及其设计目标都与C语言有着千丝万缕的联系.在Go与C语言互操作(Interoperability)方面,Go更是提供了强大的支持.尤其是在Go中使用C,你甚至可以直接在Go源文件中编写C代码,这是其他语言所无法望其项背的. 在如下一些场景中,可能会涉及到Go与C的互操作: 1.提升局部代码性能时,用C替换一些Go代码.C之于Go,好比汇编之于C. 2.嫌Go内存GC性能不足,自己手动管理应用内存. 3.实现一些库的Go Wrapper.比如Or