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

.NET No need to recompile program after library editing

请考虑这种情况:

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 class 编译在一个 class 库中,然后我在这个简单的程序中使用它:

    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"

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

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);
    }
}

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

输出:a:"a"b:"b"c:""

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

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

您的更改没有破坏 class TestType 的界面(并且是严格添加的),因此没有 API- 兼容性失败。

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