.net SqlException对于同一System.Data版本具有不同的构造函数

.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:

我有以下两台安装了.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: 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
现在,您可以选择反向工程工具、reflector、dotPeek、ILSpy或任何其他工具来打开提取的文件。报告结果

另外,就地升级不是很危险吗?我在用反思来解决问题 创建一个SqlException实例,现在它突然被破坏了 通过安装更高版本的框架


危险的是(阅读非未来证明)使用未记录的功能的方式并不打算使用。没有人可以禁止你这样做,但如果你这样做了,你就只能靠自己了:制造商对私有实施细节没有任何保证。

我看到你用两个新问题编辑了你的帖子。我会试着在这里解决这些问题

有人能确认这个类在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
现在,您可以选择反向工程工具、reflector、dotPeek、ILSpy或任何其他工具来打开提取的文件。报告结果

另外,就地升级不是很危险吗?我在用反思来解决问题 创建一个SqlException实例,现在它突然被破坏了 通过安装更高版本的框架

危险的是(阅读非未来证明)使用未记录的功能的方式并非如此