Browse by Tags
All Tags »
.NET (RSS)
.NET Framework v4.0和VisualStudio 2010 Beta1已经出来有阵子了,估计有些喜欢尝鲜的朋友已经下载试用了。这一次发布包含了大量的新功能。我们上海CLR开发团队会编写一系列的文章介绍Interop的相关新功能。我来给大家简单介绍一下Stub Method Redirection功能。这个功能是CLR上海开发团队设计、开发并测试的新功能之一,这一次我们上海CLR小组共开发了下面几个功能 1. Managed TlbImp (Rewrite) 2. Stub Method
Read More...
最近在网上发现一个小程序Windows Live Writer Backup Utility可以用来备份Windows Live Writer的Blog设置。我有好几个Blog,使用Windows Live Writer在不同Blog上面发布非常方便,但是因为我有时候会重装一下系统试一下其他的系统,比如Windows 7 Beta,并且马上可能就要最近出RC,因此,如果可以备份Blog的设置的话是非常方便的。这个程序非常简单,勾上你要备份的数据,然后选择Backup即可: 可是点击Backup,这个程序最终居然抛出异常:
Read More...
不知道各位使用.NET开发的朋友是否有遇到过一些非常奇怪的问题而不知道如何下手呢?这个时侯CLR本身提供的StressLog功能就非常有用了。这个StressLog可以在很多时候把CLR所做的事情记录下来,比如,对于一个很简单的最后抛出异常的.NET程序Log大致如下: STRESS LOG: facilitiesToLog = 0x8000ffff levelToLog = 16 MaxLogSizePerThread = 0x20000 (131072) MaxTotalLogSize = 0x2000000
Read More...
大家好。距离上次我们发布在CodePlex上的新版本TlbImp已经过了快半年了。在这半年的时间内,除了主要进行.NET 4.0相关的新功能开发之外,我们上海CLR小组也没有忘记进行TlbImp相关功能的继续开发,于今年3月9日再次发布了TlbImp的一个新版本: http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=17579 这次版本中我们引入了两个重要功能: 1. 通过规则自定义互操作程序集以及规则自定义编辑器
Read More...
这次我主要讲RCW的原理,生命周期,引用计数,套间,System.__ComObject,事件调用原理等内容。CCW由于时间限制就不涉及了,毕竟大家还是以使用RCW为主。 感兴趣的朋友可以在下面注册: 公共语言运行库(CLR)开发系列课程(4):COM Interop进阶 (Level 300) 讲 师: 张羿 课程简介: 本次课程我们将介绍.NET调用COM组件上使用上的一些常见问题,特别是RCW创建、释放、和套间的交互等比较容易出错的地方。之后,我们将简介CCW的使用方法。 推荐指数
Read More...
从字面上看,GetHRForException函数的作用很简单:得到Exception所对应的HRESULT的值。但是,GetHRForException还会做一件事情:设置当前线程的IErrorInfo使之指向该Exception(严格来说是获得Exception的CCW中的IErrorInfo接口指针)。如果对IErrorInfo不熟悉的朋友们可以把IErrorInfo看成COM版本的GetLastError或者errno。设置IErrorInfo会导致之后的代码如果使用GetErrorInfo查询IErrorInfo的值,会获得一个非0的结果,那么有些代码可能会认为程序出错而拒绝继续执行。更糟糕的是,如果之后的代码在做COM
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...
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...
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...
刚才刚看完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。
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...
在 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...
对.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...
这其实已经不是新闻了但是我还是觉得应该提一下。Shared Source CLI essentials这本书是市面上唯一讲解CLR内部实现的书籍,非常具有参考价值。现在这本书的作者正在编写第二版,而且准备将这本书用PDF和Word文档的方式免费放在网上供大家下载!现在已经有了一个初稿(Draft),有兴趣的朋友可以在这里下载: http://callvirt.net/files/Shared%20Source%20CLI%202.0%20Internals%20DRAFT.pdf Blog原文:
Read More...