CLR是否在运行时从引用的程序集中选择了引用的方法定义?

时间:2016-10-17 00:03:18

标签: c# .net clr

我在简单的C#控制台应用程序中观察到一种非常奇怪的行为。我无法理解为什么CLR会以这种方式工作。以下是我的代码示例:

我的主要节目:

class Program
{
    static void Main(string[] args)
    {
        Employee emp = new Employee();
        Console.WriteLine( emp.EmployeeName());
    }
}

包含上述Main方法的控制台应用程序项目引用另一个名为CustomDataObjects的C#类库项目。如下:

namespace CustomDataObjects
{
    public class Employee
    {
        public string GetEmployeeName()
        {
            return "Foo";
        }
    }
}

我构建了一切,它完美无缺。 Main功能打印" Foo"在控制台上。

现在我更改了我的CustomDataObjects项目,如下所示。我更改了GetEmployeeName方法的签名,并引入了一个名为empName

的新强制参数
namespace CustomDataObjects
{
    public class Employee
    {
        public string GetEmployeeName(string empName)
        {
            return empName;
        }
    }
}

进行这些更改后,我没有重新编译我的控制台项目。在进行了上述更改后,我只是重新编译了CustomDataObjects项目。然后,我将新构建的CustomDataObjects.dllCustomDataObjects.pdb文件复制到主控制台项目的\ bin \ debug目录中。

现在我尝试从主控台项目的bin \ debug目录运行主控制台应用程序的可执行文件。令我惊讶的是它并没有崩溃。如果我没有错,在第二次运行时,CLR应该尝试查找具有旧签名的GetEmployeeName的定义,该签名没有任何参数,并且由于CustomDataObjects.dll已经更改,因此应该观察到不匹配导致运行时崩溃。为什么不这样呢?我的控制台应用程序在.Net v4.0上运行

0 个答案:

没有答案