หากฉันต้องการเรียกใช้แอปพลิเคชัน. NET ในเครื่องที่ไม่มี. NET framework มีวิธีใดบ้างในการรวบรวมแอปพลิเคชันกับโค้ดเนทีฟ
หากฉันต้องการเรียกใช้แอปพลิเคชัน. NET ในเครื่องที่ไม่มี. NET framework มีวิธีใดบ้างในการรวบรวมแอปพลิเคชันกับโค้ดเนทีฟ
คำตอบ:
Microsoft มีบทความที่อธิบายถึงวิธีการคอมไพล์ MSIL เป็น Native Code
Native Image Generator (Ngen.exe) เป็นเครื่องมือที่ช่วยเพิ่มประสิทธิภาพของแอปพลิเคชันที่มีการจัดการ Ngen.exe สร้างอิมเมจดั้งเดิมซึ่งเป็นไฟล์ที่มีรหัสเครื่องเฉพาะของโปรเซสเซอร์ที่คอมไพล์แล้วและติดตั้งลงในแคชอิมเมจดั้งเดิมบนเครื่องคอมพิวเตอร์ รันไทม์สามารถใช้อิมเมจดั้งเดิมจากแคชแทนโดยใช้คอมไพเลอร์ just-in-time (JIT) เพื่อคอมไพล์แอสเซมบลีดั้งเดิม
น่าเสียดายที่คุณยังต้องการไลบรารีจากเฟรมเวิร์กเพื่อรันโปรแกรมของคุณ ไม่มีฟีเจอร์ใดที่ฉันรู้จักกับ MS .Net framework SDK ที่ช่วยให้คุณสามารถรวบรวมไฟล์ที่ต้องการทั้งหมดลงในไฟล์ปฏิบัติการเดียว
RemoteSoft สร้างเครื่องมือที่รวบรวมแอปพลิเคชัน. NET ไว้ในแพ็คเกจที่สามารถเรียกใช้โดยไม่ต้องติดตั้ง. NET ฉันไม่มีประสบการณ์กับมัน:
ดังที่คำตอบอื่น ๆ ได้กล่าวไว้ที่นี่คุณสามารถใช้เครื่องมือ. NET Nativeเพื่อรวบรวมแอปของคุณกับรหัสเครื่องดั้งเดิม อย่างไรก็ตามไม่เหมือนกับคำตอบเหล่านั้นฉันจะอธิบายวิธีการทำ
ขั้นตอน:
ติดตั้งเครื่องมือdotnet CLI (อินเตอร์เฟสบรรทัดคำสั่ง) ซึ่งเป็นส่วนหนึ่งของ. NET Core toolchain ใหม่ เราจะใช้สิ่งนี้เพื่อรวบรวมแอปของเรา คุณสามารถค้นหาบทความดีๆเกี่ยวกับเรื่องนี้ได้ที่นี่
เปิดเชลล์พร้อมต์และcd
ไปยังไดเร็กทอรีของแอพของคุณ
พิมพ์สิ่งนี้:
dotnet compile --native
แค่นั้นแหละ! เมื่อคุณทำเสร็จแล้วแอปของคุณจะถูกคอมไพล์เป็นไบนารีเดียวดังนี้:
มันจะเป็นปฏิบัติการแบบสแตนด์อโลน ไม่มีไฟล์ PDB แอสเซมบลีหรือไฟล์กำหนดค่า (ไชโย!)
หรือหากคุณต้องการโปรแกรมที่เร็วยิ่งขึ้นคุณสามารถเรียกใช้สิ่งนี้:
dotnet compile --native --cpp
ซึ่งจะเพิ่มประสิทธิภาพโปรแกรมของคุณโดยใช้โปรแกรมสร้างโค้ด C ++ (ตรงข้ามกับ RyuJIT) ดังนั้นแอปของคุณจึงได้รับการปรับให้เหมาะสมกับสถานการณ์ AOT มากยิ่งขึ้น
คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ที่ dotnet CLI GitHub repo
ฉันได้ทดสอบหลายรายการและในขณะนี้สิ่งเดียวที่รองรับ. NET 3.5 และยังมีสแต็คการจำลองเสมือนที่ยอดเยี่ยมคือXenocode Postbuild
ด้วย ngen คุณยังคงต้องติดตั้ง. NET framework แต่การใช้เครื่องมือเช่นนี้โค้ดที่มีการจัดการทั้งหมดของคุณจะถูกคอมไพล์เป็นโค้ดเนทีฟเพื่อให้คุณสามารถปรับใช้กับเครื่องได้โดยไม่ต้องมีเฟรมเวิร์ก
Microsoft ได้ประกาศ. NET Native Previewซึ่งจะอนุญาตให้เรียกใช้แอปพลิเคชัน. NET โดยไม่ต้องติดตั้งเฟรมเวิร์ก
ดู: http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx
คำถามที่พบบ่อย: http://msdn.microsoft.com/en-US/vstudio/dn642499.aspx
คุณสามารถดาวน์โหลด Microsoft .NET Native สำหรับ VS2013 ได้จากที่นี่: http://msdn.microsoft.com/en-US/vstudio/dotnetnative
ใช่โดยใช้Ngenซึ่งเป็น Native Image Generator อย่างไรก็ตามมีหลายสิ่งที่คุณต้องระวัง:
สรุปแล้วการใช้ Ngen จะคุ้มค่าหากคุณต้องการลดเวลาเริ่มต้นของแอปพลิเคชัน
คุณสามารถ! อย่างไรก็ตามคุณถูก จำกัด ไว้ที่. NET 1.1 (ไม่มีชื่อสามัญสำหรับคุณ): การ รวบรวม Mono Ahead-Of-Time (AOT)
อย่างไรก็ตามนี่หมายความว่าการคอมไพล์นั้นเป็นแบบเนทีฟจริงๆดังนั้นคุณจะไม่สามารถใช้งานแอสเซมบลี bytecode เดียวได้อีกต่อไปคุณจะต้องใช้หนึ่งตัวต่อแพลตฟอร์ม
เดิมถูกออกแบบมาเนื่องจากไม่มี. NET หรือ Mono สำหรับ iPhone ดังนั้นจึงเป็นวิธีที่พวกเขาสร้าง MonoTouch
คุณสามารถทำได้โดยใช้เทคโนโลยีการรวบรวมข้อมูลล่วงหน้าใหม่ที่เรียกว่า. NET Native ลองดูที่นี่: http://msdn.microsoft.com/en-US/vstudio/dotnetnative
ขณะนี้มีให้บริการเฉพาะสำหรับ Windows Store Apps ดำเนินการเชื่อมโยงองค์ประกอบเดียว ดังนั้นไลบรารี. NET Framework จะเชื่อมโยงกับแอปของคุณแบบคงที่ ทุกอย่างถูกคอมไพล์เป็นเนทีฟและแอสเซมบลี IL จะไม่ถูกนำไปใช้ แอปไม่ทำงานกับ CLR แต่รันไทม์ที่ปรับให้เหมาะสมที่สุดเรียกว่า Managed Runtime (Mrt.dll)
ตามที่ระบุไว้ข้างต้น NGEN ใช้แบบจำลองการรวบรวมแบบผสมผสานและอาศัย IL และ JIT สำหรับสถานการณ์แบบไดนามิก .NET Native ไม่ได้ใช้ JIT แต่รองรับสถานการณ์แบบไดนามิกต่างๆ ผู้เขียนโค้ดจะต้องใช้ Runtime Directivesเพื่อให้คำแนะนำกับ. NET Native compiler เกี่ยวกับสถานการณ์แบบไดนามิกที่ต้องการสนับสนุน
คุณสามารถใช้ ngen.exe เพื่อสร้างอิมเมจดั้งเดิมได้แต่คุณยังต้องแจกจ่ายโค้ดดั้งเดิมที่ไม่ใช่เนทีฟด้วยและยังต้องใช้เฟรมเวิร์กที่ติดตั้งบนเครื่องเป้าหมาย
ซึ่งไม่สามารถแก้ปัญหาของคุณได้จริงๆ
2019 คำตอบ: ใช้dotnet / corert สามารถคอมไพล์โครงการ. NET Core เป็น.exe
ไฟล์แบบสแตนด์อโลน ไม่มีการอ้างอิง (ยกเว้นไลบรารีระบบเช่นkernel32.dll
) ฉันพนันได้เลยว่านี่คือสิ่งที่ OP ต้องการ
จากหน้าแรกของ GitHub:
คอมไพเลอร์ CoreRT สามารถคอมไพล์แอ็พพลิเคชัน. NET Core ที่มีการจัดการลงในไฟล์ปฏิบัติการไฟล์เดียวแบบเนทีฟ (เฉพาะสถาปัตยกรรม) ซึ่งง่ายต่อการปรับใช้ นอกจากนี้ยังสามารถสร้างไลบรารีไดนามิกหรือสแตติกแบบสแตนด์อโลนที่แอปพลิเคชันที่เขียนด้วยภาษาโปรแกรมอื่น ๆ สามารถใช้ได้
ลักษณะของ. NET คือสามารถติดตั้งแอปที่คอมไพล์ไปยัง MSIL ได้จากนั้นโดย JIT หรือ Ngen MSIL จะถูกคอมไพล์เป็นโค้ดเนทีฟและเก็บไว้ในแคช ไม่เคยมีจุดมุ่งหมายในการสร้าง. exe แบบเนทีฟจริงที่สามารถรันได้โดยไม่ขึ้นกับ. NET framework
อาจมีแฮ็คบางอย่างที่ทำสิ่งนี้ได้ แต่ฟังดูไม่ปลอดภัยสำหรับฉัน มีพลวัตมากเกินไปที่ต้องการเฟรมเวิร์กเช่นการโหลดแอสเซมบลีแบบไดนามิกการสร้างโค้ด MSIL เป็นต้น
เหตุผลหลักในการคอมไพล์เป็น Native คือเพื่อรักษาความปลอดภัยของโค้ดของคุณมิฉะนั้นการคอมไพล์ MSIL ก็เหมือนกับการปรับใช้ซอร์สโค้ดในเครื่องของไคลเอ็นต์
NGEN รวบรวมเป็นเนทีฟ แต่ยังต้องปรับใช้รหัส IL จุดประสงค์นี้เป็นเพียงเพื่อลดเวลาในการเริ่มต้น แต่ก็ไร้ประโยชน์เช่นกัน
CoreRt เป็นเวอร์ชันอัลฟาและใช้งานได้เฉพาะกับแอปประเภท helloworld แบบธรรมดาเท่านั้น
.Net Core รวบรวมเป็นไฟล์ปฏิบัติการไฟล์เดียว แต่ยังไม่ใช่ exe ดั้งเดิมนี่เป็นเพียงไฟล์ซิปของรหัส IL และจะคลายซิปรหัสลงในโฟลเดอร์ชั่วคราวในขณะที่ทำงาน
คำถามง่ายๆของฉันจาก Microsoft คือถ้า RyuJIT สามารถรวบรวม IL เป็นเนทีฟได้ทันทีทำไมคุณไม่สามารถรวบรวม IL แบบเดียวกันล่วงหน้า (AOT) ได้
ดูเหมือนว่าโซลูชันที่ใช้งานได้ของ net core RT ในไม่ช้าแอพทั้งหมดจะเข้าสู่. net core; https://www.codeproject.com/Articles/5262251/Generate-Native-Executable-from-NET-Core-3-1-Proje?msg=5753507#xx5753507xx https://docs.microsoft.com/en-us / archive / msdn-magazine / 2018 / พฤศจิกายน / net-core-Publishing-options-with-net-core
ไม่ได้ทดสอบอาจจะมี win .net sdk เก่าที่เป็นไปได้ทำคล้ายกัน
ลองทำเช่นนี้ ( http://www.dotnetnative.online/ ) เพื่อรวบรวม. net ที่คอมไพล์ exe ไว้ใน exe ดั้งเดิมฉันลองแล้วมันใหม่ แต่ดี
คิดว่าคงไม่ไหว คุณจะต้องแจกจ่าย. NET FW ด้วย หากคุณต้องการคอมไพล์แอพ. NET กับโค้ดเนทีฟให้ใช้เครื่องมือ NGen