Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从.NET 4.5.1应用程序(EXE)引用.NET 3.5 DLL将使用.NET 4.5.1对象_C#_.net_Vb.net - Fatal编程技术网

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

C# 从.NET 4.5.1应用程序(EXE)引用.NET 3.5 DLL将使用.NET 4.5.1对象,c#,.net,vb.net,C#,.net,Vb.net,所以我有一个DLL,它是用.NET3.5编译的。我当前正在调试此DLL中的以下行: 在VB.NET中: Dim result As IAsyncResult = CType(Cmd, SqlClient.SqlCommand).BeginExecuteNonQuery() 或者(用C#) 我从.NET 4.5.1编译的.EXE引用此DLL,当我在VS调试器中查看上述代码中的“result”对象时,我看到: Id = 1, Status = WaitingForActivation {1},

所以我有一个DLL,它是用.NET3.5编译的。我当前正在调试此DLL中的以下行:

在VB.NET中:

 Dim result As IAsyncResult = CType(Cmd, SqlClient.SqlCommand).BeginExecuteNonQuery()
或者(用C#)

我从.NET 4.5.1编译的.EXE引用此DLL,当我在VS调试器中查看上述代码中的“result”对象时,我看到:

Id = 1, Status = WaitingForActivation {1}, Method = "{null}", Result = "{Not yet computed}" 
这看起来像一个.NET4.0任务对象(查看属性“Status”)。为什么我在.NET3.5DLL中看到.NET4.x对象?NET版本的混合是如何工作的

NET版本的混合是如何工作的

您在这里发现的基本问题是混合.NET版本不起作用。不可能,微软利用.NET4.0的机会重新设计了许多标准的.NET类。举个例子,StringBuilder类被完全重新设计,现在使用rope作为内部数据结构,以避免长字符串进入LOH。并且字符串类被更改,优化以删除不必要的内部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的详细信息。

它没有,至少在本例中没有。可执行应用程序定义要使用的运行时版本,从而定义加载的框架库。这意味着加载的ADO.NET库是.NET 4.5.1的库。至于您在调试器中看到的内容,任务实现了
IAsyncResult
,因此它是从实现APM样式的任何方法返回的有效对象。@PanagiotisKanavos这就是答案。你应该这样做。
Id = 1, Status = WaitingForActivation {1}, Method = "{null}", Result = "{Not yet computed}"