所以我有一个使用.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 Compiled .EXE引用此DLL,当我在VS调试器中查看上面代码中的“result”对象时,我看到:
Id = 1, Status = WaitingForActivation {1}, Method = "{null}", Result = "{Not yet computed}"
这看起来像一个.NET 4.0 Task对象(看到属性“Status”)。为什么我在.NET 3.5 DLL中看到.NET 4.x对象?如何混合使用.NET版本?
答案 0 :(得分:7)
如何混合使用.NET版本?
你在这里发现的基本事情是混合.NET版本不会工作。它不能,微软利用.NET 4.0的机会重新设计许多标准的.NET类。就像一个例子,StringBuilder类完全重新设计,现在使用 ropes 作为内部数据结构,以避免长字符串进入LOH。并且更改了String类,并对其进行了优化以删除不必要的内部m_arrayLength字段。更多这方面的例子。
在程序中混合使用不同的字符串类型是行不通的,你不能用v4.0字符串设置v2.0 SqlCommand.CommandText属性,例如,对象完全不兼容。
这不是微软所做的,他们以不同的方式解决了这个问题。您的.NET 3.5目标程序集将说它依赖于System.Data,版本2.0.0.0。 CLR识别此程序集,它将翻译引用并将其替换为4.0.0.0程序集。这是完全自动的,没有配置可以影响这种翻译。
确保4.0.0.0版本完全可以替代2.0.0.0版本是微软的负担。实际上并不难做到,很少出错。通常只是因为他们也把4.0版本作为修复几个2.0运行时错误的机会,应用程序可能会意外地依赖它。从技术上讲,你需要重新测试你的应用程序,以确保你没有。
因此,这解释了它,调试器向您显示内部结构并显示v4.0详细信息。