緣起
很多時候,我們需要引用在不同平台下的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,答案是可以,
那么我們嘗試着在不同平台上添加不同的條件,如下圖:
經過驗證,我們發現,成功了……
擴展
Condition除了可以用==以外,還可以用!=,<, >, <=, >=等關系操作符,!,And,Or等邏輯操作符,詳見MSBuild Conditions。
VS工程文件中包含Properties(定義於PropertyGroup中)
和ItemGroups (定義在ItemGroup中)兩種類型的變量。$(PropertyName) 可引用所有定義在
PropertyGroup中的變量,詳見
MSBuild的簡單介紹與使用
。
在VS工程文件中最下面還有一行注釋了的代碼,這就是著名的生成前和生成后事件
關於MSBuild的更多知識,感興趣的可以查看MSDN相關文檔。
平台和平台目標
平台是指在配置管理器中定義的平台(位於生成菜單下),對應於Platform
平台目標是指在項目生成屬性中設置的目標平台,對應於PlatformTarget