CLR如何在运行时区分具有相同名称但在不同程序集中没有名称空间的类?

时间:2013-12-13 17:25:06

标签: c# .net namespaces

CLR如何在运行时区分具有相同名称但在不同程序集中没有名称空间的类?

示例:

装配:Assembly1

public class Foo
{
    public void Test()
    {
        Console.WriteLine("Assembly 1 class Foo");
    }
}

请注意,Foo类没有任何命名空间。

程序集:Assembly2

public class Foo
{
    public void Test()
    {
        Console.WriteLine("Assembly 2 class Foo");
    }
}

请注意,Foo类在这里也没有任何命名空间。

因此,Assembly1和Assembly2具有相同名称但没有名称空间的类。

汇编:TestAssembly1 ---->参考:Assembly1

namespace TestAssembly1 
{
    public class TestAssembly1Class
    {
        public void CallFooMethod()
        {
            new Foo().Test();   //How CLR would know this Foo is from Assembly 1 at runtime?
        }
    }
}

汇编:TestAssembly2 ---------->参考:Assembly2

namespace TestAssembly2 
{
    public class TestAssembly2Class
    {
        public void CallFooMethod()
        {
            new Foo().Test();   //How CLR would know this Foo is from Assembly 2 at runtime?
        }
    }
}

现在假设有一个可执行文件说MyShell.exe有Main方法。看起来像是跟着。

 class Program
    {
        static void Main(string[] args)
        {
            new TestAssembly1Class().CallFooMethod();
            new TestAssembly2Class().CallFooMethod();
        }
    }

所以这里的问题是,两个Foo类都没有任何命名空间,当执行MyShell.exe时,CLR如何区分这些冲突的Foo类?

2 个答案:

答案 0 :(得分:1)

  

CLR如何区分具有相同名称但没有相同名称的类   运行时在不同程序集中的命名空间?

两种类型都有不同的AssemblyQualifiedName

答案 1 :(得分:1)

因为在包含之前独立编译两个程序集,并且两个类型都分配了一个包含程序集名称的完全限定名称。

当编译引用前两个程序集的第三个程序集并绑定名称时,冲突将通过完全限定名称解析。