.net SqlException对于同一System.Data版本具有不同的构造函数
我有以下两台安装了.net framework版本的计算机:.net SqlException对于同一System.Data版本具有不同的构造函数,.net,.net,我有以下两台安装了.net framework版本的计算机: 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(版本=4.0.0.0)时,我得到以下结果: // Type:
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(版本=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)
{
}
}
// 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)
{
}
}
在机器B上使用dotpeek反编译System.Data(版本=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)
{
}
}
// 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,但是我不明白一个具有相同版本和PublicKeyToken的dll如何能够在同一个类中有不同的实现
有人能确认这个类在4.0和4.5之间发生了变化吗
另外,就地升级不是很危险吗?我使用反射创建了一个SqlException实例,但现在安装了更高版本的框架,这一点突然被打破了。这是因为实现是私有的。由于
SqlException
构造函数是私有的,因此SqlException
类之外的任何代码都不能调用它。然后,它是DLL的内部实现,不会影响任何外部代码
因此,虽然DLL的实现发生了变化,但没有任何公共接口发生变化,因此它与以前的版本完全兼容。也许更改是为了修复现有版本中的一些bug
该DLL旨在作为现有DLL的替代品。为此,它必须具有与以前版本相同的版本和令牌,任何现有代码都可以使用它,而无需重新编译。这是因为实现是私有的。由于
SqlException
构造函数是私有的,因此SqlException
类之外的任何代码都不能调用它。然后,它是DLL的内部实现,不会影响任何外部代码
因此,虽然DLL的实现发生了变化,但没有任何公共接口发生变化,因此它与以前的版本完全兼容。也许更改是为了修复现有版本中的一些bug
该DLL旨在作为现有DLL的替代品。为此,它必须具有与以前版本相同的版本和令牌,任何现有代码都可以使用它,而无需重新编译。这是因为实现是私有的。由于
SqlException
构造函数是私有的,因此SqlException
类之外的任何代码都不能调用它。然后,它是DLL的内部实现,不会影响任何外部代码
因此,虽然DLL的实现发生了变化,但没有任何公共接口发生变化,因此它与以前的版本完全兼容。也许更改是为了修复现有版本中的一些bug
该DLL旨在作为现有DLL的替代品。为此,它必须具有与以前版本相同的版本和令牌,任何现有代码都可以使用它,而无需重新编译。这是因为实现是私有的。由于
SqlException
构造函数是私有的,因此SqlException
类之外的任何代码都不能调用它。然后,它是DLL的内部实现,不会影响任何外部代码
因此,虽然DLL的实现发生了变化,但没有任何公共接口发生变化,因此它与以前的版本完全兼容。也许更改是为了修复现有版本中的一些bug
该DLL旨在作为现有DLL的替代品。为了使它工作,它必须具有与以前版本相同的版本和令牌,任何现有代码都可以使用它,而不必重新编译。我看到您在编辑帖子时提出了两个新问题。我会试着在这里解决这些问题 有人能确认这个类在4.0和4.5之间发生了变化吗 您可以自己确认:
- 下载
- 下载
- 下载
- 使用7zip打开4.0下载
- 在里面找到netfx_Core.mzz,然后用7zip打开
- 提取系统数据dll amd64/系统数据dll x86
- 在4.5.1下载中重复上述步骤,使用netfx_Full_GDR.mzz而不是netfx_Core.mzz
危险的是(阅读非未来证明)使用未记录的功能的方式并不打算使用。没有人可以禁止你这样做,但如果你这样做了,你就只能靠自己了:制造商对私有实施细节没有任何保证。我看到你用两个新问题编辑了你的帖子。我会试着在这里解决这些问题 有人能确认这个类在4.0和4.5之间发生了变化吗 您可以自己确认:
- 下载
- 下载
- 下载
- 使用7zip打开4.0下载
- 在里面找到netfx_Core.mzz,然后用7zip打开
- 提取系统数据dll amd64/系统数据dll x86
- 在4.5.1下载中重复上述步骤,使用netfx_Full_GDR.mzz而不是netfx_Core.mzz