Browse by Tags
All Tags »
COM (RSS)
这次我主要讲RCW的原理,生命周期,引用计数,套间,System.__ComObject,事件调用原理等内容。CCW由于时间限制就不涉及了,毕竟大家还是以使用RCW为主。 感兴趣的朋友可以在下面注册: 公共语言运行库(CLR)开发系列课程(4):COM Interop进阶 (Level 300) 讲 师: 张羿 课程简介: 本次课程我们将介绍.NET调用COM组件上使用上的一些常见问题,特别是RCW创建、释放、和套间的交互等比较容易出错的地方。之后,我们将简介CCW的使用方法。 推荐指数
Read More...
使用过COM来访问.NET组件的朋友们应该都会注意到在对应注册表中有一个RuntimeVersion的键值: 这个RuntimeVersion的命名很容易让人误认为RuntimeVersion是用来指定该.NET组件所应该运行的CLR的版本号。实际上,这个键值的意思和字面上不是特别一致。如果我们考虑一个情况:首先,进程中先创建一个.NET类型的实例,RuntimeVersion标记为1.1,然后再创建一个.NET类型的实例,其RuntimeVersion标记为v2.0,那么到底会加载那些CLR版本呢?其实,在目前的.NET版本(Silverlight除外)中,因为无法支持在同一个进程中加载多个不同版本的CLR,因此无法支持真正的按照RuntimeVersion来加载不同的CLR版本。实际上,CLR总是加载最新的CLR版本(严格来说其实是mscoree.dll来加载)。因此,在之前的情况下,如果机器上面安装了1.1和2.0,实际上进程只加载了2.0的CLR,而没有加载1.1。如果机器上面只有1.1的话,第一个1.1的.NET会创建成功,并且启动1.1的CLR,第二个2.0的.NET类型会创建失败,并且返回REGDB_E_CLASSNOTREG
Read More...
在PDC上,Misha Shneerson和Andrew Whitechapel的Session:Under the Hood: Advances in the .NET Type System中披露了.NET 4.0中Interop的新功能:Type Equivalency,而内部我们都将这个Feature称之为NO PIA(Primary Interop Assembly)。这个Feature是VB/C#/Interop小组共同努力合作完成的,可以说是CLR Interop在.NET 4.0中最大的改进之一。我会在接下来的几篇Blog中介绍我们为什么要做这个Feature,以及这个Feature的使用方法,工作原理,等等。想先睹为快的朋友可以先下载Video和PPT:
Read More...
两个星期之前CLR Interop小组再次发布了TlbImp的新版本。本来是早就应该写篇Blog介绍一下的,只是一直忙于CLR Interop新功能开发,难以抽出时间。这次版本添加了两个小功能: 1. /v2开关 在新版本的TlbImp中,我们不能随意改变新版本的行为,以避免当用户采用新版本的时候产生兼容性问题而导致程序编译出错,或者行为不正确。这个开关是用来告诉TlbImp采用新版本的行为,并且忽略兼容性要求。现在打开/v2开关只有一个作用(以后会加入更多):将struct/union中的VARIANT_BOOL转换为bool,而非以前版本的short,从而方便了用户的使用。实际上很多用户都在要求这个改动。老版本TlbImp的将VARIANT_BOOL转换为short的行为是由于老版本的Interop
Read More...
对.NET中COM Interop比较熟悉的朋友应该都对TlbImp比较了解了。这个工具是专门用来将Type Library(类型库)转换成对应的Interop Assembly,以便在.NET程序中使用对应的COM组件。这个Interop Assembly中主要包含RCW(Runtime Callable Wrapper)的Metadata(而非源代码。RCW的实现其实是在CLR内部),以及部分事件处理代码(如EventProvider),是.NET/COM Interop中不可或缺的一部分。
Read More...
大家在进行COM Interop编程的时候,不知道]是否会见到这样的情况。通常,我们通过TlbImp.exe把一个类型库(Type Library)转换成Interop Assembly。比如在Type Library里面有一个coclass叫做MyComObject,那么在Interop Assembly中也存在一个MyComObjectClass这样一个托管类型。用户可以直接使用这个MyComObjectClass操作MyComObject这样一个COM对象,比如使用new创建,调用方法,等等。因为MyComObjectClass并不是MyComObject这个COM对象本身,而是像一个代理(Proxy),.NET中我们将其称为RCW
Read More...
经常看到有朋友问到类似的问题,问题本身不复杂,但是答案不是特别明显,这里我把解决方法 Post 出来和大家共享一下,希望能够有所帮助。 假设我们有下面的 A.cs 文件: using System; using System.Runtime.InteropServices; [InterfaceType(ComInterfaceType.InterfaceIsDual)] public interface IA {
Read More...
现在做 .NET Framework 的开发的朋友应该是越来越多了, 但是可能并非人人都对 MSCOREE.DLL 非常了 解 。而事实上,毫不夸张地说, MSCOREE.DLL 是 .NET Framework 中最为核心的 DLL 之一,没有这个 DLL ,托管程序根本无法开始执行起来,但是由于这个 DLL 藏在 System32 目录下,根本无人问津,可以说是有点委屈了这位 .NET Framework 中的幕后英雄。本文主要讨论 MSCOREE.DLL 的几大作用,以及讨论 MSCOREE.DLL
Read More...
When marshalling COM interface pointers between apartments, in native code, usually you should use CoMarshalInterThreadInterfaceInStream & CoGetInterfaceAndReleaseStream: HRESULT CoMarshalInterThreadInterfaceInStream( REFIID riid, LPUNKNOWN pUnk,
Read More...
Let’s look at the following code (code for IHello is omitted): [Guid("25088995-7924-4B15-B01A-EA7C422ADC68")] public class CHelloClass : IHello { [DispId(1)] [MethodImplAttribute(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
Read More...