.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 或其他标识符作为链接方式,因此您可以将任何程序集替换为另一个程序集,前提是它包含具有相同预期成员的相同预期类型 - 这是一个安全问题,因此存在强命名的原因.
请考虑这种情况:
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 或其他标识符作为链接方式,因此您可以将任何程序集替换为另一个程序集,前提是它包含具有相同预期成员的相同预期类型 - 这是一个安全问题,因此存在强命名的原因.