张羿的CSDN专栏

.NET/CLR 4.0开发中~~

用户操作
[即时聊天] [发私信] [加为好友]
张羿ID:ATField
176825次访问,排名448,好友0人,关注者83人。
目前在微软公司从事CLR/.NET Framework的Interop功能(COM Interop, P/Invoke, Reverse P/Invoke)的开发工作。微软CLR上海开发团队的成员之一
ATField的文章
原创 95 篇
翻译 1 篇
转载 11 篇
评论 195 篇
张羿的公告
作者简介

目前在微软公司从事CLR(公共语言运行时,Common Language Runtime)的Interop功能(COM Interop, P/Invoke, Reverse P/Invoke...)的开发工作。微软CLR上海开发团队的成员之一

CLR上海开发团队Blog

联系方式

转载清注明作者和出处

我的其他Blog
我的MSDN Blog
最近评论
wdyzgym:来到公司就一直用2.0,前段时间装了VS2008,那是刚好有个项目,就在2008上做了。结果客户一看,不行,他们那边还没装2008,所以又要改回2005去,郁闷。。
公司直到最近才打算用2008开发,也许是迫于压力吧,现在4.0都出来了,还再继续用2.0的,也太落伍了。。。
eeeerr:那么快,还是先等等再说用
jetcui:顶楼上
bear927:看了上面很多人的留言
怎摸发现很多程序员这样怕学习
当程序员又不是公务员
学习本来就很正常
何况很多版本的演进都是加了很多新的语法
除了要熟悉用的类跟语法以外
基本原理都一样
何况很多後面版本的改进都在为了让大家少了很多冗长的代码让程序员更快开发
所以如果把版本更新当成是语言不好的话
那些人其实挺好笑……
vipwan:万变不离其宗,1.1,2.0扎实了,后面的不懂也 不碍大局.
文章分类
收藏
    相册
    MetaWeblog API
    ACM & Algorithms
    Top Coder
    Ural Online Judge
    UVa Online Judge
    Blog Links
    Adam Nathan(RSS)
    BCL Team Blog(RSS)
    Chris Brumme(RSS)
    David Notario(RSS)
    Jeffrey Richter's Blog(RSS)
    Josh Williams(RSS)
    Junfeng Zhang(RSS)
    Mason Bendixen(RSS)
    Matt Pietrek's Blog(RSS)
    Mike Stall(RSS)
    Patrick Dussud(RSS)
    Raymond Chen's Blog(RSS)
    Scott Guthrie(RSS)
    Silverlight上海开发团队Blog(RSS)
    Suzanne Cook(RSS)
    Thottam R. Sriram(RSS)
    Varun Sekhri(RSS)
    VBCTI team blog(RSS)
    Yun Jin(RSS)
    Compilers
    GCC
    Java Hotspot VM
    Python
    www.compilers.net
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes
    2008年11月03日

    置顶 原创 .NET 4.0: Type Equivalency (1) – Byebye,PIA收藏

    在.NET 4.0 CTP中,最引人注目的Interop的改进当属Type Equivalency,又称之为NO PIA。在介绍如何使用这个新特性之前,我觉得还是应该从历史讲起,探究我们究竟要解决什么样子的问题,过去采用了什么样的解决办法,以及这些办法都有那些问题。 在.NET中,为了访问COM对象,需要定义一系列托管的Interface、Struct、以及class。有了类型库(TypeLibrary)之后,使用TlbImp便可以自动生成一个Assembly,我们称之为Interop Assembly,简称为IA,里面包含有TypeLibrary所对应的类型,如TlbImp stdole2.tlb结果为: 然后,开发人员所写的程序可以直接引用这个DLL,使用其中定义的类型来访问对应的COM对象。在单个程序中,这个模型工作的相当好。 但是,在实际项目项目中,我们可能会遇到这样一个问题:A公司发布某个COM组件A,并同步发布对应的.NET Wrapper,并且引用到了stdole中的某个类型。该组件A的开发者选择自己用TlbImp来产生一个stdole2.tlb的对应的int阅读全文>

    发表于 @ 2008年11月03日 22:38:00|评论(loading...)|收藏

    2008年11月02日

    原创 Microsoft PDC 2008 Talk在线观看和下载地址收藏

    官方的所有Session的列表:https://sessions.microsoftpdc.com/public/timeline.aspx Channel 9:http://channel9.msdn.com/pdc2008/ 两个大致差不多,前面那个可以比较方便的查看所有的Session,也可以下载,或者转到Channel 9的直接在线看,就是感觉在点击Session的时候页面相应速度慢点。 在线观看是使用Silverlight技术的,感觉还可以,比较清晰,不过速度慢了点,还是下载下来慢慢看吧…阅读全文>

    发表于 @ 2008年11月02日 23:56:00|评论(loading...)|收藏

    原创 VS 2010 & .NET 4.0 CTP下载地址(10/31放出)收藏

    http://www.microsoft.com/downloads/details.aspx?FamilyID=922b4655-93d0-4476-bda4-94cf5f8d4814&DisplayLang=en 有11个RAR分卷压缩文件,解压缩之后大小为23G的一个VHD文件,还是相当大的,需要使用Virtual PC加载。在.NET 4.0 CTP中CLR Interop的新功能是Type Equivalency,又称为No PIA,欢迎试用并提出您的宝贵意见。关于详细的使用方法我会在后面的Blog中详细讲述。CTP提交Feedback的地方是:https://connect.microsoft.com/VisualStudio/content/content.aspx?ContentID=9790 Feedback会有专人处理,如果最后确定是Bug,会以Bug的形式提到开发人员处进行评估和处理。阅读全文>

    发表于 @ 2008年11月02日 00:42:00|评论(loading...)|收藏

    2008年11月01日

    原创 PDC:Anders谈C# 4.0:新功能和展望收藏

    刚才刚看完Anders的PDC Talk,感觉C# 4.0的变化不是很大,但是很多改动都方便了用户的使用,有些甚至当初Anders本来不愿意加入的功能最后由于用户的呼声最后还是加进去了(如Optional Parameters),可见Anders对用户的意见还是非常重视的。稍微总结一下,C# 4.0中有下面这些功能: 1. dynamic/IDynamicObject 这个改进使得C#向动态语言又进了一步,虽然C#并不会变成类似Perl/Python之类的动态语言(因为Anders认为静态语言所支持的一些特性比如Intellisense,类型检查等等是相当有用的),但是这并不代表C#不应该对动态特性提供更好的支持。从我们Interop的角度来看,dynamic比较类似COM中的IDispatch,也就是动态的根据提供的函数/属性名字动态选择匹配的动作并执行之,只不过这个接口现在变成了IDynamicObject。写法也很类似VB6。 原来要写: 1: object obj = GetObject(); 2: obj.GetType(阅读全文>

    发表于 @ 2008年11月01日 23:27:00|评论(loading...)|收藏

    2008年10月30日

    原创 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的使用方法,工作原理,等等。如果有时间,我也会考虑做一个Webcast。想先睹为快的朋友可以先下载Video和PPT: TL02 Under the Hood: Advances in the .NET Type System Misha Shneerson, Andrew Whitechapel Enhancements to the type system in the next 阅读全文>

    发表于 @ 2008年10月30日 09:08:00|评论(loading...)|收藏

    2008年10月25日

    原创 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 Marshaler(应该是.NET v1.0)不支持这个转换。之后虽然Marshaler支持了这个行为,但我们一直没有机会对TlbImp做出相应修改。此次CodePlex发布TlbImp给了我们很好的机会来修改TlbImp使之支持这些我们一直想做但是没有做的功能,而且也不用等到下个阅读全文>

    发表于 @ 2008年10月25日 21:42:00|评论(loading...)|收藏

    2008年10月05日

    原创 ATL:IDispatchImpl, IDispEventImpl, IDispEventSimpleImpl的区别和联系收藏

    这几个类都和IDispatch的实现有关系,但是他们提供的IDispatch的实现是不同的。 IDispatchImpl只能用于双接口(Dual Interface)的实现。IDispatchImpl本身的IDispatch接口实现是使用ITypeInfo::Invoke的。ITypeInfo简单来说是一个代表TypeLibrary中一个类型的COM对象,比如某个interface IA。而ITypeInfo::Invoke是把DispID使用TypeLibrary中的接口定义,换算成虚函数的Index,然后通过虚函数表(Vtable)来直接调用接口的函数。举例来说: [dual] Interface IA : IDispatch { [id(1)] HRESULT FuncA(); [id(2)] HRESULT FuncB(); } IA所对应的ITypeInfo对象(严格来说是实现ITypeInfo接口的COM对象)调用Invoke方法,传入id=2。ITypeInf阅读全文>

    发表于 @ 2008年10月05日 22:31:00|评论(loading...)|收藏

    原创 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 to a C-style structure that you use to marshal managed formatted classes. Valid for platform invoke methods only. 先说Struct,MarshalA阅读全文>

    发表于 @ 2008年10月05日 14:32:00|评论(loading...)|收藏

    2008年09月25日

    原创 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中不可或缺的一部分。 为了方便大家能够及时使用到最新版本的TlbImp(而不用等到下一个Visual Studio版本),参考TlbImp的实现,理解TlbImp的工作原理,以及添加新的功能,我们决定将最新版本的TlbImp在CodePlex上发布,并公开源代码。主页于今天早上上线: http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=17579 这个版本主要由CLR Interop上海团队开发,完全使用托管代码(阅读全文>

    发表于 @ 2008年09月25日 23:25:00|评论(loading...)|收藏

    2008年09月23日

    原创 Shared Source CLI essentials 第二版将免费收藏

    这其实已经不是新闻了但是我还是觉得应该提一下。Shared Source CLI essentials这本书是市面上唯一讲解CLR内部实现的书籍,非常具有参考价值。现在这本书的作者正在编写第二版,而且准备将这本书用PDF和Word文档的方式免费放在网上供大家下载!现在已经有了一个初稿(Draft),有兴趣的朋友可以在这里下载: http://callvirt.net/files/Shared%20Source%20CLI%202.0%20Internals%20DRAFT.pdf Blog原文: http://callvirt.net/blog/entry.aspx?entryid=b9a94d0c-761a-4d6b-bc2f-d6a5f8c1a4a7阅读全文>

    发表于 @ 2008年09月23日 22:24:00|评论(loading...)|收藏

    2008年09月06日

    原创 【预告】我主讲的MSDN Webcast之二:公共语言运行库(CLR)开发系列课程(2):Pinvoke 进阶(Level 300)收藏

    下面是我主讲的MSDN Webcast:公共语言运行库(CLR)开发系列课程的第二讲P/Invoke进阶的链接,有兴趣的朋友可以在这里登记一下: http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032387495&EventCategory=4&culture=zh-CN&CountryCode=CN   语言:中文. 产品:Microsoft .NET 受众: 开发人员. 持续时间:90 分钟 开始日期:2008年9月16日 14:30中国 讲座内容: P/invoke 在开发.NET程序当中有着无法替代的作用,可以用于调用.NET类库尚未支持的API,调用第三方组件,和遗留代码交互以保证平滑迁移到.NET等等。在上次讲座中我们讨论了Pinvoke的基本使用方法。这次我们将介绍如何进一步控制P/Invoke的行为,特别是托管数据和非托管数据的转换问题。 课程讲师: 张羿 微软(中国)研发集团服务器与开发工具事业部CLR开发专家 20阅读全文>

    发表于 @ 2008年09月06日 15:17:00|评论(loading...)|收藏

    2008年06月17日

    原创 微软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 Language Runtime(公共语言运行时),相信大部分朋友比较熟悉,是微软公司开发的一个虚拟机,用于运行基于中间代码(Intermediate Language,简称IL)的.NET程序,支持多种语言以及混合编程(C#/VB/C++/...),支持垃圾收集等。从事CLR开发的CLR Team比较大,大概有一两百来人。CLR Interop Team则是CLR Team中的专门关注托管代码和非托管代码交互的一个Team,成员分布在上海和美国,共同合作开发维护Intero阅读全文>

    发表于 @ 2008年06月17日 20:44:00|评论(loading...)|收藏

    2008年06月15日

    原创 什么是System.__ComObject: 强类型RCW和弱类型RCW收藏

    大家在进行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 (Runtime Callable Wrapper)。但是在有些情况下,在使用某些函数的时候,理论上应该返回一个MyComObjectClass,然而实际返回的却是一个System.__ComObject类型,这是什么原因呢? 事实上,RCW是存在两种类型的,一种是强类型(Strongly Typed)的RCW,另外一种是弱类型的RCW,即Syst阅读全文>

    发表于 @ 2008年06月15日 15:03:00|评论(loading...)|收藏

    2008年03月05日

    原创 #import从.NET DLL生成的Tlb的神秘错误收藏

    经常看到有朋友问到类似的问题,问题本身不复杂,但是答案不是特别明显,这里我把解决方法Post出来和大家共享一下,希望能够有所帮助。 假设我们有下面的A.cs文件: using System; using System.Runtime.InteropServices;   [InterfaceType(ComInterfaceType.InterfaceIsDual)] public interface IA {        Type Func(); }   [ComVisible(true)] public class A : IA {        public Type Func()        {               return n阅读全文>

    发表于 @ 2008年03月05日 22:52:00|评论(loading...)|收藏

    原创 位于上海的微软服务器与开发工具事业部的Blog已经开张,欢迎大家访问收藏

    微软在上海的研发中心的正式名称是服务器和开发工具事业部,主页的地址是:http://www.microsoft.com/china/CRD/groups05.mspx 而Blog的地址是:http://blogs.msdn.com/stbcblog/ 顺便为我们的部门作一下广告,呵呵。我目前所在的部门是服务器和开发工具事业部下面的Developer's Division,简称为DevDiv。这个部门主要是负责开发工具和平台的开发,主要的产品都是大家非常熟悉的,如Visual Studio (C++/C#/VB/...),.NET Framework, 以及最新的Silverlight等等。目前上海这边对这些产品均有涉及,而我所在的小组主要还是以.NET Framework/Common Language Runtime/Silverlight为主。改天有空我打算写一篇文章,介绍一下我所在的CLR小组内部是怎么进行产品开发的,使用了哪些工具,采用了怎样的软件开发流程等等。 如果大家有兴趣加入服务器和开发工具事业部,请留意招聘网站上的信息:http://www.microsoft.com/阅读全文>

    发表于 @ 2008年03月05日 20:23:00|评论(loading...)|收藏

    Csdn Blog version 3.1a
    Copyright © 张羿