C# 基础系列--程序集一

  类的可访问属性有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”。

 

好吧,这是多么沮丧的实验,发现原来我们不懂程序集。

不知不觉,发现 这一页已经很多内容了,看样要多页来阐述这个程序集了

 

posted @ 2012-07-13 09:20  望江南  阅读(1477)  评论(0编辑  收藏  举报