簡體   English   中英

任何cpu和x64之間的托管代碼引用

[英]Managed code references between any cpu and x64

我有一個混合模式C ++ / CLI項目,編譯為x86和x64凍結dll。

我有一個需要使用這個項目的C#應用​​程序,編譯為“任何CPU”。 如何從c#app正確引用正確的dll? 如果我右鍵單擊添加引用,我必須只選擇2個dll中的一個。
我的“任何CPU”C#應用程序有時會運行為x64,有時運行為x86進程。

我聽說你可以通過智能配置文件來做到這一點。

有幾種方法可以解決這個問題。 第一個是最簡單的,承認你的應用程序實際上確實依賴於目標架構。 並且AnyCPU不是正確的設置。 這是非常罕見的需要堆積如山的虛擬地址內存空間從64位得到的,特別是因為你還想要和需要,使之在x86工作。 因此,將EXE的平台目標設置為x86,您就完成了。

其次是結論是這只是一個部署問題。 當您的應用程序安裝在64位操作系統上時,您所要做的就是復制混合模式程序集的x64版本,x86構建在32位操作系統上。 您需要創建一個負責此操作的安裝項目。 最簡單的方法是創建其中兩個。 也是唯一的方式afaik。

第三個是鈴聲在哪里工作,無論如何,你無疑要問的是。 這需要更改代碼,項目和安裝程序。 你需要做的是編寫一個post-build事件,創建兩個名為“x86”和“x64”的子目錄。 並將相應版本的DLL復制到其中。 這可確保CLR無法找到這些程序集。

在您的代碼中,您必須為AppDomain.CurrentDomain.AssemblyResolve事件編寫事件處理程序。 在嘗試使用程序集中的任何類型之前,請在Main()方法中對其進行訂閱。 事件處理程序必須使用Assembly.LoadFrom()根據IntPtr.Size的值從子目錄加載正確的程序集。 在64位模式下運行時為8。

我應該提一下另一種方法,但這在SO上通常不贊成。 將兩個程序集安裝到GAC中。 一切都是自動的。

即使您的C ++項目編譯兩次,它也應該具有x86和x64 DLL的相同托管接口。 因此,只要您不使用強名稱簽名,您引用的DLL版本就無關緊要。 重要的是在目標機器上部署了正確的版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM