关于“程序集与命名空间”

不少.NET程序因为动态加载等需要反射技术,所以了解此技术显得非常重要。在此想给大伙儿逐一介绍一下:

1)基础知识——程序集与命名空间:

.NET中有两个最容易被忽略的东西莫过于“程序集”和“命名空间”。初学者往往容易在此地混淆,因此需要介绍一番:

所谓“程序集”(Assembly),可以理解成一个exe或者dll程序的“签名档”——其包含了程序的版本、文件名等一系列信息。我们可以通过右键某个exe或者dll,查看此信息。例如编写了一个控制台的exe程序,右键查看属性截图如下:

其中这些属性已经包含到了一个叫做AssemblyInfo.cs文件中(在C#中默认位置在于Properties文件夹下,VB.NET则需要点击“显示全部文件”按钮,然后从“My Project”中找到该文件)。或者您可以右键某个项目,属性之后切换到“应用程序(Application)”面板随后点击“程序集信息(Assembly Info……)”即可对程序信息进行编辑。

不过值得注意的是最底下一行的“原始文件名”——这个映射的是你“应用程序”面板中“程序集名称”中的名称默认情况下“程序集名称”=“根命名空间”=“生成的exe或者dll”的名称,但是实际上并不对等;因此您可以修改任意一项),修改完毕以后注意以下事项:

1)程序集名称:映射“程序集”信息中“原始文件名”。

2)根命名空间:当右键项目创建一个cs代码文件之后自动的那个namespace名称就是此名称,反射经常需要使用“根命名空间1.根命名空间2…….根命名空间N.类”的方式寻找到指定的类进行反射其中属性或者方法,因此值得注意的是——默认的“根命名空间”也可以随意修改,和默认的那个命名空间毫无关系。

谈到“命名空间”大伙儿可以把它理解成一个个文件夹,而每一个class相当于里边的文件;自然文件夹可以嵌套(譬如命名空间A嵌套命名空间B),除了可以写成:

[C#]

namespace A
{
     namespace B
     {
     }
}

[VB.NET]

NameSpace A
     NameSpace B

     End NameSpace
End NameSpace

更简单的做法可以直接用英文句号(实心点)分割父命名空间和子命名空间,譬如:
[C#]

namespace A.B
{

}

[VB.NET]

NameSpace A.B

End NameSpace

此时如果用反射工具查看就会发现“A”嵌套了一个“B”。和之前写法效果完全一致。
同时要注意——使用Assembly.LoadFrom/File加载一个exe或者dll然后反射其方法的时候必须按照反射工具,或者你自己代码中命名空间的绝对顺序——从根目录开始遍历的方法依次用点分割写成“命名空间1.命名空间2.……命名空间N.类的形式。譬如以上的AB嵌套的命名空间中“B”嵌套了一个类C,那么直接可以在LoadForm/LoadFile(……).GetType("A.B.C").……因为A下有一个B,B下有一个C。

一个比较特殊的情况是“根命名空间”中嵌套一个简化写法的“子命名空间”,譬如:

[C#]

namespace A
{
    namespace A.B
    {
        public class MainTest
        {
            
        }
    }
}

[VB.NET]

NameSpace A

    NameSpace A.B

           Public Class MainTest

           End Class
    
    End NameSpace

End NameSpace

或许你认为说A.B就是一个之前介绍过A中嵌套B的方式,展开后的形式为:A中又嵌套了一个A,再次嵌套了一个B(难道命名空间可以重复?!)——答案是“是的”!只要同级命名空间名字不重复,嵌套的子命名空间当然允许重复(原理与Windows资源管理器中“嵌套文件夹名称”和“父文件夹名称”可以一致!)

原文地址:https://www.cnblogs.com/ServiceboyNew/p/2656824.html