Welcome to MSDN Blogs Sign in | Join | Help

张羿的MSDN Blog

All about CLR/Interop, COM, Win32, C++

Syndication

Browse by Tags

All Tags » Interop   (RSS)
CodePlex上TlbImp新版本发布:基于规则的自定义功能
大家好。距离上次我们发布在CodePlex上的新版本TlbImp已经过了快半年了。在这半年的时间内,除了主要进行.NET 4.0相关的新功能开发之外,我们上海CLR小组也没有忘记进行TlbImp相关功能的继续开发,于今年3月9日再次发布了TlbImp的一个新版本: http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=17579 这次版本中我们引入了两个重要功能: 1. 通过规则自定义互操作程序集以及规则自定义编辑器 Read More...

Posted Friday, March 13, 2009 9:19 AM by yzha | 1 Comments

Filed under: ,

预告:公共语言运行库(CLR)开发系列课程(4):COM Interop进阶
这次我主要讲RCW的原理,生命周期,引用计数,套间,System.__ComObject,事件调用原理等内容。CCW由于时间限制就不涉及了,毕竟大家还是以使用RCW为主。 感兴趣的朋友可以在下面注册: 公共语言运行库(CLR)开发系列课程(4):COM Interop进阶 (Level 300) 讲 师: 张羿  课程简介: 本次课程我们将介绍.NET调用COM组件上使用上的一些常见问题,特别是RCW创建、释放、和套间的交互等比较容易出错的地方。之后,我们将简介CCW的使用方法。 推荐指数 Read More...

Posted Monday, February 16, 2009 1:50 PM by yzha | 1 Comments

Filed under: , , ,

System.Runtime.InteropServices.GetHRForException的陷阱
从字面上看,GetHRForException函数的作用很简单:得到Exception所对应的HRESULT的值。但是,GetHRForException还会做一件事情:设置当前线程的IErrorInfo使之指向该Exception(严格来说是获得Exception的CCW中的IErrorInfo接口指针)。如果对IErrorInfo不熟悉的朋友们可以把IErrorInfo看成COM版本的GetLastError或者errno。设置IErrorInfo会导致之后的代码如果使用GetErrorInfo查询IErrorInfo的值,会获得一个非0的结果,那么有些代码可能会认为程序出错而拒绝继续执行。更糟糕的是,如果之后的代码在做COM Read More...

Posted Wednesday, January 07, 2009 3:10 PM by yzha | 1 Comments

Filed under: ,

【预告】1月6日下午14:30 CLR开发系列课程(3):COM Interop基础 (Level 300)
1月6日下午14:30我将在MSDN中文网络广播中主讲.NET中COM和COM Interop的相关基础知识。有兴趣的朋友可以通过下面的链接登记并收听此次网络广播:   公共语言运行库(CLR)开发系列课程(3):COM Interop基础 (Level 300) 讲 师: 张羿  课程简介: 从本次课程开始,今后几次课程将围绕COM和COM Interop技术,展开对托管代码和非托管代码之间通过COM进行互操作的讨论。本次课程将从COM基础知识开始,简单介绍进行COM Interop的所需相关基础知识和概念,为以后的课程做好准备。 Read More...

Posted Tuesday, December 30, 2008 1:29 PM by yzha | 1 Comments

Filed under: , ,

.NET组件的注册表中RuntimeVersion的作用
使用过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...

Posted Tuesday, December 30, 2008 1:17 PM by yzha | 1 Comments

Filed under: , ,

Marshal.SizeOf和sizeof的区别
Sizeof在非Unsafe环境下只能用于预定义的一系列类型,如Int,Short等等。而在Unsafe环境下,sizeof可以被用于值类型,但是值类型中不可以有引用类型,否则C#编译器会报错: error CS0208: Cannot take the address of, get the size of, or declare a pointer to a managed type ('SizeOf.Program.MyStruct') 而Marshal.SizeOf则是获得该类型被Marshal(转换,通常翻译为列集,指数据从一种类型转换到另外一种类型)到对应的非托管类型的大小。和sizeof不同,Marshal.SizeOf允许用在含有引用类型的值类型上: Read More...

Posted Saturday, November 29, 2008 2:32 PM by yzha | 1 Comments

Filed under: ,

.NET 4.0: Type Equivalency (2) – 内嵌类型
上次我们谈到了.NET 4.0中为什么要引入Type Equivalency这样一个新功能,这次我们来看一个比较简单的一个程序: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Office.Interop.Excel; namespace NOPIAExcelDemo { class Program { static void Main( string Read More...

Posted Monday, November 24, 2008 3:56 PM by yzha | 1 Comments

Filed under: , , ,

VS 2010 & .NET 4.0 CTP下载地址(10/31放出)
http://www.microsoft.com/downloads/details.aspx?FamilyID=922b4655-93d0-4476-bda4-94cf5f8d4814&DisplayLang=en 有11个文件,比较大,并且需要使用Virtual PC加载。 在.NET 4.0 CTP中CLR Interop的新功能是Type Equvalency,又称为No PIA,欢迎试用并提出您的宝贵意见。关于详细的使用方法我会在后面的Blog中详细讲述。 CTP提交Feedback的地方是: Read More...

Posted Saturday, November 01, 2008 5:42 PM by yzha | 2 Comments

Filed under: , , , ,

PDC: COM Interop新功能:Type Equivalency / NO PIA
在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...

Posted Thursday, October 30, 2008 2:06 AM by yzha | 1 Comments

Filed under: , , ,

TlbImp新版本发布:/v2 & /preserveSig
两个星期之前CLR Interop小组再次发布了TlbImp的新版本。本来是早就应该写篇Blog介绍一下的,只是一直忙于CLR Interop新功能开发,难以抽出时间。这次版本添加了两个小功能: 1. /v2开关 在新版本的TlbImp中,我们不能随意改变新版本的行为,以避免当用户采用新版本的时候产生兼容性问题而导致程序编译出错,或者行为不正确。这个开关是用来告诉TlbImp采用新版本的行为,并且忽略兼容性要求。现在打开/v2开关只有一个作用(以后会加入更多):将struct/union中的VARIANT_BOOL转换为bool,而非以前版本的short,从而方便了用户的使用。实际上很多用户都在要求这个改动。老版本TlbImp的将VARIANT_BOOL转换为short的行为是由于老版本的Interop Read More...

Posted Saturday, October 25, 2008 2:42 PM by yzha | 0 Comments

Filed under: , , ,

MSDN文档的错误:关于UnmanagedType.LPStruct和UnmanagedType.Struct
在 MarshalAsAttribute 中,第一个参数类型是 UnmanagedType 枚举,用以指定对应的非托管数据类型。在这个枚举类型中,有两个非常诡异的值, Unmanaged.LPStruct 和 UnmanagedType.Struct 。对于这两个枚举值,在 MSDN 文档中是这么讲的: Struct A VARIANT, which is used to marshal managed formatted classes and value types. LPStruct A pointer Read More...

Posted Sunday, October 05, 2008 2:44 PM by yzha | 1 Comments

Filed under: ,

TlbImp源码在CodePlex公开!欢迎下载
对.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...

Posted Thursday, September 25, 2008 11:26 PM by yzha | 1 Comments

Filed under: , ,

微软CLR Interop Team的CodePlex主页上线!Interop Assistant代码公开!
经过一段时间的筹备,在Team的几位PM的共同策划之下,在CodePlex上面的CLR Interop主页终于上线了。CodePlex是微软公司开办的一个开源网站,上面的项目主要以.NET相关为主。我们CLR Interop Team决定在这里建立一个主页,专门用于存放内部成员所开发的Interop相关工具。主页的地址是: http://www.codeplex.com/clrinterop 可能有些朋友还不清楚CLR Interop Team究竟是从事什么方面的开发,这里简单介绍一下。CLR,也就是Common Read More...

Posted Tuesday, June 17, 2008 1:44 PM by yzha | 3 Comments

Filed under: , ,

#import从.NET DLL生成的Tlb的神秘错误
经常看到有朋友问到类似的问题,问题本身不复杂,但是答案不是特别明显,这里我把解决方法 Post 出来和大家共享一下,希望能够有所帮助。 假设我们有下面的 A.cs 文件: using System; using System.Runtime.InteropServices;   [InterfaceType(ComInterfaceType.InterfaceIsDual)] public interface IA {        Read More...

Posted Wednesday, March 05, 2008 2:53 PM by yzha | 1 Comments

Filed under: , , ,

.NET中不是Attribute的Attribute
大家都知道 AssemblyVersionAttribute 是用来指定 Assembly 的版本号使用的,但是不知道你有没有考虑过这个问题:这个 Attribute 真的生成到了最后的 Assembly 中吗? 我们建立一个简单的 C# 项目试一下便可以知道。在新建的 C# 项目中 AssemblyInfo.cs 缺省有如下的内容:   using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; Read More...

Posted Wednesday, February 20, 2008 3:04 PM by yzha | 3 Comments

Filed under: ,

More Posts Next page »
Page view tracker