2011-04-26 557 views

回答

7

AnyCPU DLL在調用進程的上下文中運行,根據您的問題它是x64。如果此AnyCPU DLL加載另一個DLL,這也運行在加載AnyCPU DLL的x64調用進程的上下文中。這是跨不同平臺運行代碼的問題。如果要通過調用AnyCPU DLL的x64process運行32位DLL,則需要創建一個名爲SURROGATE進程的東西 - 這基本上是一個x86(32位)進程,可以運行並加載32位DLL你想從調用x64進程訪問。一旦運行了此x86進程,此x64進程就可以使用進程間通信與x86進程(已加載x86 DLL)進行通信,並且可以實現從x64進程間接調用x86 DLL函數。

1

不,您無法將32位DLL加載到64位進程中。

AnyCPU意味着C#DLL可以加載到32位或64位進程中,而不是它可以加載任一位的DLL。

2

您只能加載與進程具有相同位的dll。 Any CPU DLL本身可以在64位和32位進程中加載​​,但這並不意味着可以將本機32位DLL加載到64位進程中。

我知道的唯一解決方法是有一個32位幫助進程,加載您的32位DLL,然後與該進程進行通信。

+0

其他解決方法是讓AnyCPU程序集加載對應於該體系結構的C++ DLL – CharlesB 2011-04-26 09:57:58

+0

如果您擁有64位版本的dll,那顯然是最好的解決方案。 – CodesInChaos 2011-04-26 10:05:51

0

32位DLL無法在64位進程中加載​​。

我在您的問題中看到一個問題:您的AnyCPU程序集不可能加載32位C++ dll,因爲它使該程序集特定於此體系結構。

使之成爲AnyCPU意味着它將動態加載特定於它所運行的體系結構的DLL。這種方式運行於任何CPU

總之,該程序集被錯誤地標記爲AnyCPU。

+0

32位程序集也可以在任何CPU上運行。 – 2011-04-26 09:59:37