簡體   English   中英

將.NET App轉換為x86本機代碼

[英]Converting .NET App to x86 native code

有一個完全用C#編寫的程序,它以.NET Framework 2.0為目標。 有沒有辦法我可以以某種方式編譯(翻譯)托管EXE到本機的EXE,因此它可能是.NET不可知的? 我知道可能有商業產品用於此目的......但它們有點貴。

問題是我們要在運行沒有安裝.NET Framework的Windows XP的計算機上部署該程序。 還要求程序的大小不得超過500Kb(最大1Mb),因為它是從Web服務器下載的(現在大小為255Kb)。 這就是為什么我們無法將完整的.NET FX(甚至是簡化的)附加到下載程序的文件中。

顯然,這是一個可怕的軟件工程錯誤應該早先檢測到並避免,所以我們可以使用像C ++這樣的本機技術。

我們現在已經嘗試過Novell的Mono - 一個用於Linux,MAC和Windows的.NET Framework的開源實現。 Mono由C#編譯器,IDE,運行時(CLR)和類庫程序集組成(如System.dll和mscorlib.dll - 非常類似於安裝到GAC的.NET的類庫程序集)。 我們嘗試做的是找到CLR文件並將它們與我們程序的文件和一些程序集一起發送。 這樣,可以通過在用戶的計算機上運行“mono program.exe”(命令提示符)來調用該程序。 除了給最終用戶CLR文件(mono.exe和mono.dll)的這種使用帶來的不便之外,總共大約2.5 Mb,遠遠大於所需的500 Kb甚至1 Mb。

所以,我們沒有其他選擇,只能通過編譯器將我們的.NET應用程序轉換為本機應用程序,但問題仍然存在 - 我們應該使用什么編譯器以及我們在哪里可以找到...

目前我偶然發現了微軟研究院的Singularity OS項目。 它是一個開源研究操作系統,用托管代碼編寫(至少部分)。 Singularity OS包括一個Bartok編譯器,操作系統使用該編譯器將托管程序轉換為本機程序(x86 32位)。 應該注意的是,Bartok無法將.NET 2.0的所有方面都轉換為本機代碼,但大部分都是如此。 但是我還沒有學會如何使用奇點......

如果你能提供一些有關問題的有用提示和建議,你自己使用Singularity OS和Bartok Compiler的經驗,或者我忽略的問題的另一種方法以及解決方法,我將非常感謝你。

非常感謝你提前!

最后,使用Mono的Full AOT功能(在Callum Rogers的建議下)我設法生成了缺少CLI頭的program.exe.dll。 所以它看起來就像一個原生的dll。 但是,我無法弄清楚如何將該DLL轉換為exe或使其運行。 此dll似乎也沒有暴露任何感興趣的函數,如main函數。

從Mono項目中查看AOT(Ahead Of Time)編譯。 這會將您的托管項目編譯為本機exe或elf可執行文件(取決於您定位的系統), 而不需要JIT 這是用於將單聲道應用程序添加到iPhone(不允許使用JIT / Framework)的技術,並且還具有更快的啟動時間,更低的內存使用率以及使人們更難以反編譯代碼的額外好處。 你說你已經在使用Mono,所以它應該是兼容的。

在mono-project.com網站Miguel de Icaza的博客 (和iPhone信息 )上閱讀相關內容。

請注意,您不能使用動態代碼或通用接口

interface IFoo<T> {
...
    void SomeMethod ();
}

並且您將必須編譯您使用的所有庫的DLL。

PS:確保為您的問題使用“完整”AOT。

2018年更新

在Build 2018,微軟發布了支持Windows桌面應用程序的WinNet 3.0路線圖 (Winform和WPF)

2017年更新

對於控制台應用程序,您可以使用.net核心自包含部署(SCD) 即使是一個hello world應用程序,你的軟件包也會達到50MB +。 您仍然需要安裝VC運行時。

更新

正如@ jenix的評論 ,.NET Native僅適用於Windows應用商店應用(UWP)。 經過3年的宣布,這仍然是正確的,桌面的.net native可能會被microsoft刪除。 所以這個答案不再適用了。

========

Microsoft在Build 2014上宣布了.NET Native Preview

使用.NET Native Developer Preview,應用程序將作為完全獨立的本機編譯代碼部署在最終用戶設備上,並且不會依賴目標設備/計算機上的.NET Framework。 因此,使用.NET Native的目標計算機上不需要.NET框架。

宣布.NET Native Preview
Microsoft .NET Native

有一個名為CrossNet的項目解析.Net程序集並生成非托管C ++代碼,可以在任何標准編譯器中編譯。

不是真正的.NET到本機轉換的解決方案,但也許這有幫助: http//www.yoda.arachsys.com/csharp/faq/#framework.required

不太確定除了精心重寫應用程序之外你還能做很多事情。 為了簡化已經加重的過程,您可以使用Reflector(進入Microsoft C ++)之類的東西來反匯編.NET應用程序,並將其作為基礎來啟動,並將托管C ++引用替換為本機引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM