从 .NET 4.5.1 应用程序 (EXE) 引用 .NET 3.5 DLL 使用 .NET 4.5.1 对象

Referencing a .NET 3.5 DLL from a .NET 4.5.1 Application (EXE) uses .NET 4.5.1 Objects

所以我有一个使用 .NET 3.5 编译的 DLL。我目前正在调试此 DLL 中的以下行:

在VB.NET中:

 Dim result As IAsyncResult = CType(Cmd, SqlClient.SqlCommand).BeginExecuteNonQuery()

或(在 C# 中)

IAsyncResult result = (SqlClient.SqlCommand) Cmd.BeginExecuteNonQuery()

我从 .NET 4.5.1 编译的 .EXE 引用这个 DLL,当我在 VS 调试器中查看上面代码中的 "result" 对象时,我看到:

Id = 1, Status = WaitingForActivation {1}, Method = "{null}", Result = "{Not yet computed}" 

这看起来像一个 .NET 4.0 任务对象(参见 属性 "Status")。为什么我在 .NET 3.5 DLL 中看到 .NET 4.x 对象? .NET 版本的混合如何工作?

How does mixing of .NET versions work?

您在这里发现的基本情况是混合使用 .NET 版本不会。它不能,Microsoft 利用 .NET 4.0 的机会重新设计了许多标准的 .NET classes。例如,StringBuilder class 已完全重新设计,现在使用 ropes 作为内部数据结构以避免将长字符串放入 LOH。并且字符串 class 被更改,优化以删除不必要的内部 m_arrayLength 字段。还有很多这样的例子。

在一个程序中混合不同的字符串类型是行不通的,例如,您不能将 v2.0 SqlCommand.CommandText 属性 设置为 v4.0 字符串,对象完全不兼容。

所以这不是微软所做的,他们以不同的方式解决了它。您的 .NET 3.5 目标程序集会说它依赖于 System.Data,版本 2.0.0.0。 CLR 识别此程序集,它将 翻译 引用并将其替换为 4.0.0.0 程序集。这是完全自动的,没有任何配置会影响此翻译。

Microsoft 有责任确保 4.0.0.0 版本是 2.0.0.0 版本的完全功能替代品。实际上并不难做到,它很少出错。通常只是因为他们也将 4.0 版本作为修复几个 2.0 运行时错误的机会,应用程序可能会意外地依赖这些错误。从技术上讲,您确实需要重新测试您的应用以确保您没有。

所以这解释了它,调试器向您展示了内部结构并揭示了 v4.0 的细节。