你的程序集A里有一些类型。你有某一个程序集B。你很想让程序集B看到这些类型(A中的类型)。但是却不想让所有人都看到。你该怎么办?
在v1.0和v1.1里,你可以把这些类型标记为public,然后用StrongNameIdentityPermission来修饰。
在Whidbey+里,你可以说程序集B是程序集A的友元。(原文链接有问题,应为http://msdn2.microsoft.com/library/0tke9fxk.aspx)
注意页面中的例子不正确,正确的语法应为:
[assembly:InternalsVisibleTo ("AssemblyB, PublicKeyToken=32ab4ba45e
在InternalsVisibleToAttribute的构造器中的字符串是友元程序集的名字。
当你声明程序集B是程序集A的友元,程序集B就能访问A的非公有类型。
StrongNameIdentityPermission跟友元程序集有什么不同呢?
1. StrongNameIdentityPermission应用于单独的类型,而友元程序集应用于整个程序集。
如果你想把程序集A里成百上千个类型与B共享,你就必须把所有这些类型都用StrongNameIdentityPermission修饰。而使用友元程序集,你只要声明一次就行了。
2.更重要的是,使用StrongNameIdentityPermission,你想共享的类型必须被声明为public。而使用友元程序集,这些类型可以是(必须是)非公有的。
3.一个类型只能有一个StrongNameIdentityPermission,但是你可以声明任意多的程序集作为你的友元。
友元程序集中的友元关系是单向的。当程序集A说程序集B是它的友元,并不意味着程序集A是程序集B的友元。你必须在程序集B里显式地声明友元关系。
友元关系不是可传递的。如果程序集C是程序集B的友元,程序及B是程序集A的友元,程序集C并不会自动成为程序集A的友元。
如你所知,这只是根据预览版写的材料,以后有可能发生变化。
注:1.原文为Junfeng Zhang's blog里的一篇post。
2. Reviewed by Ninputer, 损失了你的午觉,不好意思 :)