C#在不同平台下DLL的引用問題


緣起

很多時候,我們需要引用在不同平台下的DLL,32位(X86)和64位(X64)。如果平台錯誤,在C#中會引發BadImageFormatException異常。

解決思路

我們同時不能添加不同平台下的DLL,即使名稱不一樣(會報類型同時存在於兩個DLL中)。能不能只在某種平台下引用,在其他平台下不引用呢?

VS工程的配置都保存在配置文件(.csproj)中。在VS中,找到相應的項目,右鍵選擇卸載項目,完成后項目變為灰色。然后在項目上單擊右鍵,選中編輯(項目名稱).csproj。這們我們就可以查看VS工程文件。如下圖:

q

在其中,我們發現有Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "。猜想$(Platform)是具體的平台,包括AnyCPU、X86、X64。Condition表示條件。我們通過修改Debug和Release情況下的配置可以驗證這一點(在工程的屬性->生成標簽頁中可修改)。

再往下查看工程文件,我們發現有:s

這正是我們在VS工程中所引用的DLL,那我們試試在其中能否設置Condition,答案是可以,

image

那么我們嘗試着在不同平台上添加不同的條件,如下圖:

s

經過驗證,我們發現,成功了……

在64位情況下image,在32位情況下image

擴展

Condition除了可以用==以外,還可以用!=,<, >, <=, >=等關系操作符,!,And,Or等邏輯操作符,詳見MSBuild Conditions

VS工程文件中包含Properties(定義於PropertyGroup中) 和ItemGroups (定義在ItemGroup中)兩種類型的變量。$(PropertyName) 可引用所有定義在PropertyGroup中的變量,詳見MSBuild的簡單介紹與使用

在VS工程文件中最下面還有一行注釋了的代碼,這就是著名的生成前和生成后事件s

關於MSBuild的更多知識,感興趣的可以查看MSDN相關文檔。

平台和平台目標

平台是指在配置管理器中定義的平台(位於生成菜單下),對應於Platforms

平台目標是指在項目生成屬性中設置的目標平台,對應於PlatformTarget

s

在C++中的應用

在C++中未測試過,原則上應該可以,下圖是在C++中添加一個庫目錄后工程文件中添加的條目。
s


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM