我有一個混合模式的C++/CLI項目,它被編譯爲x86和x64凍結dll。任何cpu和x64之間的管理代碼引用
我有一個C#應用程序,需要使用此項目編譯爲「任何CPU」。 我怎樣才能正確引用從C#應用程序正確的DLL? 如果我右鍵單擊添加引用,我必須只選擇2個dll中的1個。
我的「ANY CPU」C#應用程序有時會以x64運行,有時也會以x86進程運行。
我聽說你可以通過一個聰明的配置文件做到這一點。
我有一個混合模式的C++/CLI項目,它被編譯爲x86和x64凍結dll。任何cpu和x64之間的管理代碼引用
我有一個C#應用程序,需要使用此項目編譯爲「任何CPU」。 我怎樣才能正確引用從C#應用程序正確的DLL? 如果我右鍵單擊添加引用,我必須只選擇2個dll中的1個。
我的「ANY CPU」C#應用程序有時會以x64運行,有時也會以x86進程運行。
我聽說你可以通過一個聰明的配置文件做到這一點。
即使您的C++項目編譯兩次,它也應該具有用於x86和x64 DLL的相同的託管接口。因此,只要你不使用強名稱簽名,它應該與你引用的DLL版本無關。重要的是在目標機器上部署正確的版本。
如果我提到x64,並將項目設置設置爲不復制到輸出文件夾,那麼來自x86機器的我的團隊中的x86開發人員是否會遇到任何問題?除了他將不得不手動將正確的dll複製到他的輸出文件夾一次。我認爲這是一個非問題的權利? – CSharpMan 2011-03-04 16:23:22
@CSharpMan,構建不應該是一個問題,因爲x86機器可能會構建x64 DLL(如果安裝了正確的工具)。運行肯定會成爲一個問題。 – JaredPar 2011-03-04 16:24:12
@CSharpMan,我會解決這個問題的方式是我的應用程序上的調試設置限制託管應用程序爲x86,但保留零售配置爲AnyCPU。這樣每個人都可以在調試下構建並運行它。 – JaredPar 2011-03-04 16:25:01
有幾種方法可以解決這個問題。第一個是最簡單的,承認你的應用程序實際上確實對目標架構有依賴性。而且AnyCPU不是正確的設置。它很難用很難需要從x64獲得的巨大的虛擬地址內存空間,特別是因爲你也希望並且需要使它在x86上工作。因此,將EXE的平臺目標設置爲x86,即可完成。
二是得出結論,這只是一個部署問題。當您的應用程序安裝在64位操作系統上時,您需要做的就是複製混合模式程序集的x64版本,x86版本使用32位操作系統。您需要創建一個安裝項目來處理此問題。最簡單的方法是創建其中兩個。也是afaik的唯一途徑。
第三種方法是用無論哪種方式都有效的鐘聲,這是你毫無疑問問到的問題。這需要更改代碼,項目和安裝程序。你需要做的是編寫一個post-build事件,創建兩個子目錄,名稱分別爲「x86」和「x64」。並將相應版本的DLL複製到它們中。這確保了CLR找不到這些程序集。
在您的代碼中,您必須編寫AppDomain.CurrentDomain.AssemblyResolve事件的事件處理程序。在嘗試使用程序集中的任何類型之前,在您的Main()方法中訂閱它。事件處理程序必須根據IntPtr.Size的值使用Assembly.LoadFrom()從子目錄加載正確的程序集。以64位模式運行時爲8。
我應該提到另一種方法,但這通常是皺眉 - 在SO。將兩個組件都安裝到GAC中。一切都是自動的。
爲什麼不願意將兩者都安裝到GAC中? – CSharpMan 2011-03-04 16:39:08
你問錯了人,我虔誠地避免貨物崇拜節目和做法。開始一個關於它的新問題。 – 2011-03-04 16:44:27
我相信你可以通過編輯清單文件來做到這一點。我記得這樣做的用戶界面:http://msdn.microsoft.com/en-us/library/xhctdw55.aspx但我不記得你需要做什麼。 – 2011-03-04 15:56:38