標籤:
很多時候,我們需要引用在不同平台下的DLL,32位(X86)和64位(X64)。如果平台錯誤,在C#中會引發BadImageFormatException異常,未能載入或程式集。
解決思路
我們同時不能添加不同平台下的DLL,即使名稱不一樣(會報類型同時存在於兩個DLL中)。能不能只在某種平台下引用,在其他平台下不引用呢?
我們知道,VS工程的配置都儲存在設定檔(.csproj)中。在VS中,找到相應的項目,右鍵選擇卸載項目,完成後項目變為灰色,與類似。然後在項目上單擊右鍵,選中編輯(項目名稱).csproj。這們我們就可以查看VS工程檔案。如:
在其中,我們驚喜的發現有Condition=" ‘$(Configuration)|$(Platform)‘ == ‘Debug|AnyCPU‘ "。我們猜想$(Platform)是具體的平台,包括AnyCPU、X86、X64。Condition表示條件。我們通過修改Debug和Release情況下的配置可以驗證這一點(在工程的屬性->產生標籤頁中可修改)。
再往下查看工程檔案,我們發現有:
這正是我們在VS工程中所引用的DLL,那我們試試在其中能否設定Condition,答案是可以,。
那麼我們嘗試著在不同平台上添加不同的條件,如:
經過驗證,我們發現,成功了……
在64位情況下,在32位情況下。
擴充
Condition除了可以用==以外,還可以用!=,<, >, <=, >=等關係操作符,!,And,Or等邏輯操作符,詳見MSBuild Conditions。
VS工程檔案中包含Properties(定義於PropertyGroup中) 和ItemGroups (定義在ItemGroup中)兩種類型的變數。$(PropertyName) 可引用所有定義在PropertyGroup中的變數,詳見MSBuild的簡單介紹與使用
。
在VS工程檔案中最下面還有一行注釋了的代碼,這就是著名的產生前和產生後事件
關於MSBuild的更多知識,感興趣的可以查看MSDN相關文檔。
平台和平台目標
平台是指在組態管理員中定義的平台(位於產生菜單下),對應於Platform
平台目標是指在項目產生屬性中設定的目標平台,對應於PlatformTarget
在C++中的應用
在C++中未測試過,原則上應該可以,是在C++中添加一個庫目錄後工程檔案中添加的條目。
哪位朋友測試過,請指教,感激不盡
C#在不同平台下DLL的引用問題