为什么我的x64位应用程序能够加载x86位DLL?

时间:2018-02-06 18:58:47

标签: c# dll

我使用Teststand 64位(National Instrument)和我的DLL之一:

  • 测试台(64位)调用A.dll
  • A.dll的目标是“任何CPU”并引用B.dll
  • B.dll也瞄准“任何CPU”并引用C.dll
  • C.dll定位“x86”并负责数据库访问(ADO.NET)

如果我直接从Teststand 64位引用C.dll,我会因为它识别为32位而无法加载DLL。这是按目的完成的,结果与预期一样失败。

这里的问题是,当Teststand调用A.dll时,我不明白它为什么会起作用。 C.dll成功地完成了它的工作,我会发誓这应该是一个例外或任何类型的错误,但没有。

在我的脑海中,从我读过的关于x86和x64的内容来看,x64无法调用x86目标软件。

有人对此有任何解释吗?

我想了解更好地编写我的库的代码,因为这对我来说是一个DLL地狱!

1 个答案:

答案 0 :(得分:0)

在过去,dll一直都在追求特定的双重性。我们还是那些人。我喜欢称之为“原生dll”。

.NET DLL和程序打破了。他们是“无知的”。同样编译的MSIL可以作为x64和x32运行,具体取决于在计算机上执行它的框架。如果我们为此获得框架和操作系统,它甚至可以作为x128或x16运行。

只要你将它保存到.NET DLL中,双重性就不是问题了。它有时可以使用Memory约束进入,但总体上我们忽略它。一旦你开始混合本机DLL,binarity突然变成了一切。

我只能说A.DLL和B.DLL似乎是.NET DLL的。我不能告诉它变种“Teststand.exe”和C.dll是什么。或者由C.DLL调用ADO.Net DLLS。我最好的猜测是.NET代码的不间断行足够长,双重性并不重要。 Testrand onyl关心A.dll返回的内容,而不关心它是如何得到这个结果的。并且B.dll可以用.NET方式调用C.dll,其中binarity不会产生(你永远不会用裸指针)。

但是如果你试图直接从Testrand调用x32的C.DLL,它似乎就会破坏。