.NET编辑库后无需重新编译程序

时间:2015-03-16 08:42:56

标签: c# .net dll

请考虑这种情况:

public class TestType
{
    public string a
    {
        get;
        set;
    }
    public string b
    {
        get;
        set;
    }

    public override string ToString()
    {
        return string.Format("a: \"{0}\"\tb:\"{1}\"", a, b);
    }
}

TestType类是在类库中编译的,然后我在这个简单的程序中使用它:

    static void Main(string[] args)
    {
        TestType tP = new TestType();
        tP.a = "a";
        tP.b = "b";
        Console.WriteLine(tP.ToString());
        Console.ReadKey(true);
    }

显然它有效(正确执行没有错误)。

输出:a:" a" B:" B"

然后我像这样编辑库中的类:

public class TestType
{
    public string a
    {
        get;
        set;
    }
    public string b
    {
        get;
        set;
    }
    public string c
    {
        get;
        set;
    }

    public override string ToString()
    {
        return string.Format("a: \"{0}\"\tb:\"{1}\"\tc:\"{2}\"", a, b, c);
    }
}

我只重新编译库并重新运行程序(不重新编译它)。 现在我预计程序会崩溃,因为它不知道类的变化,但是它有效。

输出:a:" a" B:" B" C:""

如果类型与它知道的类型不同,它如何工作?

2 个答案:

答案 0 :(得分:3)

.NET DLL具有一定程度的向后兼容性。添加字段不是binary-breaking change

答案 1 :(得分:2)

您的更改未破坏类TestType的界面(并且严格地说是附加的),因此没有API兼容性失败。

请记住,.NET程序实际上是在JIT过程中在运行时编译的,这时会识别出像这样的错误。请注意,.NET使用名称作为链接的方式而不是GUID或其他标识符,因此您可以将任何程序集替换为另一个程序集,前提是它包含具有相同预期成员的相同预期类型 - 这是一个安全问题,因此存在强命名的原因