所以我有一个使用.NET 3.5编译的DLL.我目前正在调试此DLL中的以下行:
在VB.NET中:
Dim result As IAsyncResult = CType(Cmd, SqlClient.SqlCommand).BeginExecuteNonQuery()
Run Code Online (Sandbox Code Playgroud)
或(在C#中)
IAsyncResult result = (SqlClient.SqlCommand) Cmd.BeginExecuteNonQuery()
Run Code Online (Sandbox Code Playgroud)
我从.NET 4.5.1 Compiled .EXE引用此DLL,当我在VS调试器中查看上面代码中的"result"对象时,我看到:
Id = 1, Status = WaitingForActivation {1}, Method = "{null}", Result = "{Not yet computed}"
Run Code Online (Sandbox Code Playgroud)
这看起来像一个.NET 4.0 Task对象(看到属性"Status").为什么我在.NET 3.5 DLL中看到.NET 4.x对象?.NET版本的混合如何工作?
.NET版本的混合如何工作?
你在这里发现的基本事情是混合.NET版本不起作用.它不能,微软利用.NET 4.0的机会重新设计许多标准的.NET类.就像一个例子,StringBuilder类完全重新设计,现在使用绳索作为内部数据结构,以避免长字符串进入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的详细信息.
| 归档时间: |
|
| 查看次数: |
1481 次 |
| 最近记录: |