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

來源:互聯網
上載者:User

標籤:

很多時候,我們需要引用在不同平台下的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的引用問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.