2015-04-06 70 views
2

所以,據我所知,它確實需要一個在MSIL中編寫的可執行文件/ dll文件,並執行JIT作業:將MSIL代碼轉換爲本地機器代碼。對? 所以跑ngen使用命令生成我的程序的本機映像:ngen如何運作?

ngen install myProgram.exe 

這需要一段時間,但我發現生成的文件是在C:\Windows\assembly\NativeImages_v4.0.30319_32\myProgram\db1496cf0295bbe6a9242d86c0d8e091\myProgram.ni.exe

但是,什麼是該可執行文件的確切內容?我的C#程序的機器代碼版本?它不運行(見下文)。如果我想向用戶提供我的程序的本地版本,如果我在每個*.exe*.dll中運行ngen並將該圖像文件生成給用戶,它會正常運行嗎?它仍然需要.NET框架嗎?

但是,生成圖像不起作用,並給出「此應用程序無法在您的PC上運行」錯誤消息。

+0

好問題!如果你現在有任何好的解決方案,我真的很好奇。或者,您是否嘗試過Mono項目的AOT編譯? – Jenix 2015-11-27 09:54:44

回答

2

ngen編譯JIT代碼到機器代碼是正確的,但仍然需要.net運行時庫來運行程序。如果你的目標是製作一個不需要.net框架的程序,它將無法工作。

想起它就像編寫一個動態鏈接到C++運行時的本機程序一樣,必須安裝C++運行時才能使程序正常工作。 .net沒有與本地應用程序一樣的靜態鏈接,您必須始終安裝運行時。

此外,您不能直接運行ngen構建映像,當您運行ngen時,它會在您運行.net應用程序時將它安裝到程序集緩存(所列目錄)中,並在高速緩存中找到該副本並使用預生成代碼,你不能直接運行它。

+1

感謝澄清,我認爲它會像本機C#編譯器一樣。我會嘗試運用這個https://csnative.codeplex.com/ – Jack 2015-04-06 02:27:23