我有以下两台安装了.net框架版本的机器:
Machine A
-------------
v4.0.30319
v3.5
v3.0
v2.0.50727
v1.1.4322
v1.0.3705
Machine B
-------------
v4.5
v4.0.30319
v3.5
v3.0
v2.0.50727
v1.1.4322
v1.0.3705
在机器A上使用dotpeek反编译System.Data,Version = 4.0.0.0时,我得到以下内容:
// Type: System.Data.SqlClient.SqlException
// Assembly: System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// Assembly location: c:\WINDOWS\Microsoft.NET\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll
namespace System.Data.SqlClient
{
private SqlException(string message, SqlErrorCollection errorCollection)
{
}
}
在机器B上使用dotpeek反编译System.Data,Version = 4.0.0.0时,我得到以下内容:
// Type: System.Data.SqlClient.SqlException
// Assembly: System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// Assembly location: c:\WINDOWS\Microsoft.NET\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll
namespace System.Data.SqlClient
{
private SqlException(string message, SqlErrorCollection errorCollection, Exception innerException, Guid conId)
: base(message, innerException)
{
}
}
正如您所看到的,SqlException
具有不同的构造函数,即使System.Data
版本看起来相同。我怀疑原因是机器B安装了.NET 4.5,但我不明白具有相同Version和PublicKeyToken的dll如何可以具有相同类的不同实现。
任何人都可以确认这个类确实在4.0到4.5之间发生了变化吗?
另外,就地升级是否危险?我使用反射来创建SqlException的实例,现在通过安装更高版本的框架突然破坏了它。
答案 0 :(得分:2)
这是因为实施是私人的。由于SqlException
构造函数是私有的,因此SqlException
类之外的代码都不能调用它。然后它是DLL的内部实现,不会影响任何外部代码。
因此,虽然DLL的实现已更改,但没有任何公共接口发生更改,因此它与先前版本完全兼容。也许改变是修复现有版本中的一些错误。
DLL意味着替代现有的DLL。为此,它必须具有与先前版本相同的版本和令牌,以便任何现有代码使用它而无需重新编译。
答案 1 :(得分:1)
我看到你用两个新问题编辑了你的帖子。我试着在这里解决它们。
任何人都可以确认这个类确实在4.0到4.5之间发生了变化吗?
您可以自己确认:
现在,您可以选择逆向工程工具,反射器,dotPeek,ILSpy或其他任何东西来打开提取的文件。报告结果。
此外,就地升级是不是很危险?我正在使用反射 创建一个SqlException的实例,现在突然中断了 通过安装更高版本的框架。
什么是危险的(读取非面向未来)是以不打算使用的方式使用未记录的功能。没有人可以禁止你这样做,但如果你这样做,你就是你自己:制造商不对私人实施细节提供任何保证。
答案 2 :(得分:0)
在.Net 4.5 System.Data.SqlClient.SqlException中有一个新的重载方法CreateException。
internal static SqlException CreateException(SqlErrorCollection errorCollection, string serverVersion)
和
internal static SqlException CreateException(SqlErrorCollection errorCollection, string serverVersion, Guid conId, Exception innerException = null)
选择适合你的那个。