zoukankan      html  css  js  c++  java
  • 关于“程序集与命名空间”

    不少.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资源管理器中“嵌套文件夹名称”和“父文件夹名称”可以一致!)

  • 相关阅读:
    numpy 基础 —— np.linalg
    图像旋转后显示不完全
    opencv ---getRotationMatrix2D函数
    PS1--cannot be loaded because the execution of scripts is disabled on this system
    打开jnlp Faild to validate certificate, the application will not be executed.
    BATCH(BAT批处理命令语法)
    oracle vm virtualbox 如何让虚拟机可以上网
    merge 实现
    Windows batch,echo到文件不成功,只打印出ECHO is on.
    python2.7.6 , setuptools pip install, 报错:UnicodeDecodeError:'ascii' codec can't decode byte
  • 原文地址:https://www.cnblogs.com/ServiceboyNew/p/2656824.html
Copyright © 2011-2022 走看看