2013-10-06 15 views
2

很抱歉的混亂冠軍,在應用程序爲64位時以32位模式運行代碼,有可能嗎?

我使用C#和試圖用ArcMap的是dll文件的一堆,讓我與地理文件的工作和writen在C++中,然後包裹在託管C工作++,ArcMap的版本我在我的工作地點使用的是32位,因此與Dll交互的唯一方法是開發32位應用程序。

我有一個64位的應用程序,它使用了我編寫的位於另一個dll中的類(我可以創建32位或以任何必要的方式進行配置),該類加載ArcMap dll並嘗試使用它們讀取一些文件(形狀文件)..

問題是,我無法從64位應用程序加載32位類...並且我無法更改使用ArcMap對象從32位到64位的類,因爲然後arcmap DLL將不會加載。

我目前唯一的解決方案是將該類轉換爲控制檯項目,將其作爲32位運行並等待它完成,控制檯項目會將他紅色的數據寫入txt文件,然後我將讀取從我原來的64位應用程序。

這是我遇到的最醜陋的解決方法,我希望有人能幫助我找到更好的解決方案。

由於提前,

P.S 如果我的問題有些部分還不清楚請評論什麼,我會盡力解釋我的意思。

+0

可能重複:http://stackoverflow.com/questions/6744284/use-a-32 bit位組裝在64位環境 – Nenad

+0

是否有可能將64位應用程序轉換爲32位?除此之外,您可以使用進程間通信,但它不會比使用文本文件傳遞數據好得多。 – Andre

回答

4

您有以下限制:

  • 您不能執行32位和64位代碼相同的過程。
  • 第三方代碼以二進制形式提供爲32位模塊。

由此可以得出結論,第三方代碼必須運行在32位進程中。這意味着您有以下選擇:

  1. 如果可能的話,將您的進程轉換爲32位。這是最簡單的解決方案。
  2. 將您的進程保留爲64位,並將第三方代碼作爲單獨的進程運行。

醜陋解決您的問題描述,是落實選項2.但也有少醜陋的方式來做到這一點的方法之一。您可以使用遠程過程調用機制(RPC),而不是使用外部文件進行通信。

有很多選擇,但最明顯的是COM。將32位代碼放入進程外COM服務器,並從64位應用程序中使用它。這可以讓你編寫乾淨的代碼,使用方法調用與第三方庫進行通信。底層的RPC機制完成了在兩個進程之間獲取信息所涉及的所有低級別繁重工作。

+0

「把32位代碼放到一個進程外COM服務器」 - 你能詳細說明它是什麼意思,我不明白你說「com服務器」是什麼意思 – OopsUser

+0

我不這麼認爲是教你關於COM的地方。當然不會發表評論。如果你不明白什麼是COM服務器,那麼我想你需要做一些背景閱讀。如果你真的不瞭解COM和RPC,那麼這可能是一個步驟。所以,這使得你的應用程序轉換爲32位更吸引人的解決方案。 –

+0

當你說「COM服務器」與「COM對象」相同時,我有時間並且將會了解它嗎?我知道COM對象允許C++/c#和其他語言之間的互操作性,但我認爲它在相同的進程內運行,因此它將像加載COM對象的進程一樣以相同的「比特」(64或32)運行。 我將不勝感激鏈接或兩個相關的事情閱讀。 謝謝! – OopsUser

0

您可以通過下面的語法的64位應用程序到32位應用程序轉換: CorFlags.exe xxx.exe/32BIT +

+1

的確如此。但考慮到提供者有64位應用程序的源代碼,那麼更改目標和重新編譯會不會更容易?我的意思是,在某些時候,程序可能會重新編譯。 –

相關問題