C#中Any CPU和X86和X64平臺的差異對比

最近在C#項目中嵌入一個視頻軟件Ffplayer,出現報錯現象,提示平臺開發視頻.dll文件的兼容性和加載格式不正確的問題。最終查看是由於項目平臺選擇的是Any CPU和X86的引起的。目標平臺有什麼作用,各選項有什麼差別。

    一、在VisualStudio中,在編譯設置中有如下選項:

    x86: 將程序集編譯爲由兼容 x86 的 32 位公共語言運行庫運行。

    x64: 將程序集編譯爲由支持 AMD64 或 EM64T 指令集的計算機上的 64 位公共語言運行庫運行。

    anycpu:(默認值)將程序集編譯爲在任意平臺上運行。

    Itanium: 將程序集編譯爲由採用 Itanium 處理器的計算機上的 64 位公共語言運行庫運行。

    二、具體行爲如下:

    1)在 64 位 Windows 操作系統上:

    用 x86 編譯的程序集將在 WOW64 下運行的 32 位 CLR 上執行。

    用 x64 編譯的程序集將在 64 位 CLR 上執行。

    用 anycpu 編譯的可執行文件將在 64 位 CLR 上執行。

    用 anycpu 編譯的 DLL 將在與加載它的進程相同的 CLR 上執行。

    2)在 32 位 Windows 操作系統上:

    用 x86或anycpu 編譯的程序集將在 32 位 CLR 上執行。

    用 x64 編譯的程序集無法運行。

 說明:現在大多數用戶使用的都是在WINXP以上的系統中運行程序(不管是32位的還是64位的),因此,基本不可能選擇X64的編譯程序集。 是不是都選擇Any CPU這種默認方式就不會存在問題了呢?

    首先看看Any CPU和x86的可執行文件(EXE)在32位和64位下有什麼區別:Any CPU在32位下,EXE將以32位執行,而在64位下,EXE將以64位執行。而x86的話,始終以32位執行。

    如果用戶希望使用x86,也就是不希望64位下用64位方式執行EXE程序。系統中可能存在第三方的32位DLL,一旦使用64位執行的EXE,在調用到32位的DLL時,將無法調用。

    如果用戶希望使用Any CPU,是因爲DLL的實際運行方式是受調用它的EXE所影響的,因此設爲Any CPU就可以了(即選擇默認)。而如果設定爲x86,雖然看似沒什麼問題,但其無法在64位CLR中運行了,存在缺陷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章