2010-08-13 112 views
0

我希望能夠分發用戶可以配置爲以32位或64位方式運行的一個版本的可執行文件。該服務將有一個32位的主機進程,用於讀取配置並啓動32或64位的新進程。我沒有確定的是如何/如果針對任何CPU的可執行文件可以在64位Windows下作爲32位進程啓動。在64位Windows上以32位進程啓動MSIL exe

回答

2

這沒有什麼意義。如果您的應用程序可以作爲32位進程運行,並且不需要額外的虛擬內存空間,那麼將它作爲64位進程運行就沒有意義了。

你也不能輕易控制它。它需要更改.exe標頭中的值。 Corflags.exe實用程序可以執行此操作,但不能分發它。自己砍頭是技術上可行的,但很難很難 fugly。最終的障礙是,您通常不具有在正確安全的機器(例如UAC)上修改.exe文件所需的寫入權限。如果你真的需要這樣做,那麼只需部署兩個副本的.exe

這可以通過編寫一個非常小的引導程序.exe來完成。它所需要做的就是Assembly.Load()主要的.exe,並調用它的Program.Main()方法。構建它的兩個版本。

+0

我知道它可以強制這種方式,這是行不通的。對於大多數用途而言,64位將是首選,但對於某些向後兼容性場景,可能需要32位。部署2個副本是默認位置,但我希望有另一種方法。 – dmo 2010-08-13 19:13:46

+2

所有你需要的是一個非常麻煩的引導程序EXE。它可以Assembly.Load()主EXE並調用它的Program.Main()方法。 – 2010-08-13 19:31:52

+0

謝謝,漢斯 - 這可能是一個合理的方法。 – dmo 2010-08-13 22:23:35

0

定位任何CPU意味着您的目標是構建機器的操作系統。因此,如果您的構建機器是32位的,那麼任何CPU將構建一個32位輸出,並且如果您的構建機器是64位,那麼您將獲得64位輸出。這與您部署到的機器無關。

爲了達到你想要做的,你真的需要2個exe副本,一個是32位版本,另一個是64位版本。您可以通過將目標平臺分別設置爲32位和64位來完成此操作。再一次,如果您的目標是任何CPU,Visual Studio將選擇構建機器上當前的任何操作系統。

+0

將任何一個CPU目標庫加載到32位進程中將生成32位。所以64位機器*可以*構建32位代碼。我只是想知道是否有可能在新的過程中強制這一點。 – dmo 2010-08-13 18:34:16

+0

這就是我的觀點,它會**構建**,這意味着輸出二進制將是32位或64位,從來都不是。因此,如何以32位進程的形式啓動64位構建的二進制文件?唯一的辦法是同時擁有32/64位版本和每個配置文件啓動一個版本。 – code4life 2010-08-13 21:25:25

+0

MSIL在運行時編譯爲本地代碼(32位或64位)。問題是如何指導要構建的64位操作系統。如果項目編譯爲明確的32位或64位,則運行時將尊重該項目。如果在正在運行的進程中加載​​,它將嘗試使用與託管進程相同的方式。 .NET二進制文件被編譯爲MSIL,因此它們可以在任何主體中運行。 – dmo 2010-08-13 22:22:38

相關問題