C#從32位系統遷移到64位系統的問題

來源:互聯網
上載者:User

前段用C#做了個程式,現在要把程式支援64位系統。

  首先是把該程式支援到 Windows Server 2003 和 Windows Server 2008兩個系統,由於我的程式是在XP上測試編譯的,直接拿過去不會出什麼問題吧。

  但是在啟動並執行時候,老是報錯。沒辦法,在Server 2003上裝了VS,一步步調試,發現每當我執行到調用C++的dll時候,其中有一句就會報錯:

  “嘗試讀取或寫入受保護的記憶體。這通常指示其他記憶體已損壞”

  但是我之前的幾句調用dll的都執行通過了,而且在XP上也運行良好啊。

  試了N久也不行,換參數等等方法也都以失敗告終。

  先不管了,用最笨的方法,你執行不通過我就繞過,還好可以用其他的方法實現目的。這樣,32平台下都通過了。

  按理說,一般32位的程式64位系統都是可以啟動並執行。但是,真正移植的時候,卻還是出了問題。還是在調用C++的dll時候報

  “嘗試讀取或寫入受保護的記憶體。這通常指示其他記憶體已損壞”

  的錯誤,而且這次還變本加利,一句都通過不了,真是費解。

  這到底是怎麼回事呢?用64位的庫也不行,難道是記憶體機制的差異?

  最終搜了N久,就在我最終絕望的時候,看到了一篇文章,講的時在從32位系統移植到64位系統時候的一些問題,那篇文章裡特意把編譯時間候的platform設定為“x86”。咦,既然是要在64位下運行,為什麼還要設定為“x86”呢?

  不報希望的我試了下,結果竟然通過了。

  問題的原因就在這裡啊。然後查了點資料,簡單的放在這裡。

  VS編譯目標platform有3個選項:AnyCPU,x86和x64.如果一個程式被編譯成AnyCPU,那麼程式將包含2套相同邏輯的程式,一套在32位系統上用,另一套在64位系統上用。問題的原因就在這裡。

  如果你是在32位系統上用AnyCPU編譯了代碼,那麼代碼調用的時32位COM,在32位系統上是以32位方式運行,32位APP調用32位COM,著當然沒問題。但是如果其他人在64位系統上調用你的程式,則程式是以64位APP調用32位COM.

  當然,這裡我把編譯時間候的platform設定為“x86”,只是產生了特定於32位Intel x86相容處理器平台的代碼,所產生的程式集是基於PE32格式,可運行與WOW64子系統中,所以當然也就可以在64位系統下運行了。

  要想寫原生的64位系統下的程式還得花很大功夫才行。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.