类的可访问属性有public,private,protect,innertal,protect internal.其中internal只有在同一程序集的文件中,内部类型或成员才是可访问。下面就用这个来继续程序集的事例。
namespace AssemblyLibrary { internal class InternalClass { public int ID { get; set; } } public class PulClass { public int ID { get; set; } public InternalClass Inter { get; set; } } }
你们说这个编译能通过吗?很明显,如果基础好点同学,不用编译器就可以看出,这个是有语法错误的。作为类的属性来说,属性的访问性不能高于类型的访问性。
vs中我们可以看到程序集名称,那是不是如果我们修改为同一个程序集名称,那么internal就可以访问了呢?
那我修改测试用的控制台的程序集名称为:AssemblyLibrary,结果非常沮丧。如果你说,这个事类库和控制台,不是同一个类型的问题,那好,我们再做别一个实验,我们再新建一个类库,工程名:AssemblyLibrary2.程序集:AssemblyLibrary,默认命名空间:AssemblyLibrary。现在我们两个类库的程序集和命名空间都一样。我们开始下面的实验
namespace AssemblyLibrary { public class Show { public int ID { get; set; } } }
工程:AssemblyLibrary中我们修改代码为
namespace AssemblyLibrary { internal class InternalClass { public int ID { get; set; } } public class PulClass { public int ID { get; set; } internal InternalClass Inter { get; set; } public Show SHOW { get; set; } } }
现在工程的目录是这样的 ,AssemblyLibrary引用AssemblyLibrary2.
按F6编译,OK。没有问题。
我们用ILSPY看看编译的dll是怎么样的?
很神奇,里面只有一个dll。先不说这个,我们反编译一把。
在Ilspy中我们看到dll的程序集信息// AssemblyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
using System; namespace AssemblyLibrary { public class PulClass { public int ID { get; set; } internal InternalClass Inter { get; set; } public Show SHOW { get; set; } } }
OK,和我们写的代码是一模一样的,但是怎么点击Show 都无法跳转到相关的类中。而点击InternalClass ,可以完整的看到里面的内容。
但是,这里我们又可以看到Show的信息,这真是个有意思的现象。
好,现在我们重新加载ConsolTest并修改下代码
namespace AssemblyLibrary { class Program { static void Main(string[] args) { PulClass pu = new PulClass(); pu.ID = 1; pu.SHOW = null; Console.Read(); } } }
结果是多么糟糕,虽然pu.SHOW智能提示可以显示,但是来个错误:
错误 5 现用语言不支持“AssemblyLibrary.PulClass.SHOW” d:\documents\visual studio 2010\Projects\ConsolTest\ConsolTest\Program.cs 15 16 ConsolTest
那我们这样//pu.SHOW = null;会是怎么呢,没有错误了,但是多了4个警告。我们先无视他吧,F5,看下是神马情况。
抛出了System.TypeLoadException错误
未能从程序集“AssemblyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型“AssemblyLibrary.PulClass”。
好吧,这是多么沮丧的实验,发现原来我们不懂程序集。
不知不觉,发现 这一页已经很多内容了,看样要多页来阐述这个程序集了