วิธีรวบรวมแอปพลิเคชัน. NET กับโค้ดเนทีฟ


90

หากฉันต้องการเรียกใช้แอปพลิเคชัน. NET ในเครื่องที่ไม่มี. NET framework มีวิธีใดบ้างในการรวบรวมแอปพลิเคชันกับโค้ดเนทีฟ

คำตอบ:


45

Microsoft มีบทความที่อธิบายถึงวิธีการคอมไพล์ MSIL เป็น Native Code

คุณสามารถใช้Ngen

Native Image Generator (Ngen.exe) เป็นเครื่องมือที่ช่วยเพิ่มประสิทธิภาพของแอปพลิเคชันที่มีการจัดการ Ngen.exe สร้างอิมเมจดั้งเดิมซึ่งเป็นไฟล์ที่มีรหัสเครื่องเฉพาะของโปรเซสเซอร์ที่คอมไพล์แล้วและติดตั้งลงในแคชอิมเมจดั้งเดิมบนเครื่องคอมพิวเตอร์ รันไทม์สามารถใช้อิมเมจดั้งเดิมจากแคชแทนโดยใช้คอมไพเลอร์ just-in-time (JIT) เพื่อคอมไพล์แอสเซมบลีดั้งเดิม

น่าเสียดายที่คุณยังต้องการไลบรารีจากเฟรมเวิร์กเพื่อรันโปรแกรมของคุณ ไม่มีฟีเจอร์ใดที่ฉันรู้จักกับ MS .Net framework SDK ที่ช่วยให้คุณสามารถรวบรวมไฟล์ที่ต้องการทั้งหมดลงในไฟล์ปฏิบัติการเดียว


1
ฉันไม่พบเหตุผลอื่นใดที่จะใช้สิ่งนี้นอกเหนือจากการแสดง รหัส CLR ยังสามารถอ่านได้เหมือนเดิมและคุณยังต้องใช้. NET ที่น่าผิดหวังมาก Microsoft ไม่ได้จัดหาเครื่องมือที่จะแก้ไขสิ่งที่ฉันคิดว่าเป็นปัญหาใหญ่ (ใคร ๆ ก็สามารถดูรหัสระดับสูงของคุณได้เหมือนเดิม)
MasterMastic

ฉันไม่เห็นด้วยกับ Espo เนื่องจากข้อความที่เป็นสีเทาระบุว่า "Runtime" ซึ่งหมายถึง CLR และ. NET Framework ที่เข้ามาในภาพตามที่ Chris ชี้ให้ถูกต้อง อย่างไรก็ตามจุด NGen เป็นเรื่องจริง คำถามคือโดยไม่ต้องใช้ CLR / Runtime / .NET Framework ทั้งหมดจะเหมือนกัน
จัสมิน

1
ถึงเวลาตื่นเต้นแล้ว แต่ดูเหมือนว่า. net framework จะได้รับคอมไพเลอร์แบบเนทีฟ - msdn.microsoft.com/en-US/vstudio/dotnetnative
ferventcoder

ILMerge คุณ .NET ปฏิบัติการและทุกอย่างในต้นไม้พึ่งพาแล้ว Ngen ถ้าคุณต้องการปฏิบัติการที่เป็นอิสระจาก .NET

24

RemoteSoft สร้างเครื่องมือที่รวบรวมแอปพลิเคชัน. NET ไว้ในแพ็คเกจที่สามารถเรียกใช้โดยไม่ต้องติดตั้ง. NET ฉันไม่มีประสบการณ์กับมัน:

RemoteSoft Salamander


5
นั่นเป็นเครื่องมือเดียวที่ฉันเคยได้ยินมาว่าสามารถทำได้โดยไม่ต้องใช้กรอบ แน่นอนราคา $ 1249
Slapout

3
ฉันพยายามสองสามครั้งในช่วงไม่กี่ปีที่ผ่านมาเพื่อรับข้อมูลหรือการประเมินผล แต่พวกเขาไม่เคยส่งอีเมลเกี่ยวกับการกำหนดราคาหรือการสาธิตกลับมาเลยดังนั้นฉันคิดว่าผลิตภัณฑ์ของพวกเขาอาจเป็นที่สงสัยเล็กน้อย
codenheim

22

ดังที่คำตอบอื่น ๆ ได้กล่าวไว้ที่นี่คุณสามารถใช้เครื่องมือ. NET Nativeเพื่อรวบรวมแอปของคุณกับรหัสเครื่องดั้งเดิม อย่างไรก็ตามไม่เหมือนกับคำตอบเหล่านั้นฉันจะอธิบายวิธีการทำ

ขั้นตอน:

  1. ติดตั้งเครื่องมือdotnet CLI (อินเตอร์เฟสบรรทัดคำสั่ง) ซึ่งเป็นส่วนหนึ่งของ. NET Core toolchain ใหม่ เราจะใช้สิ่งนี้เพื่อรวบรวมแอปของเรา คุณสามารถค้นหาบทความดีๆเกี่ยวกับเรื่องนี้ได้ที่นี่

  2. เปิดเชลล์พร้อมต์และcdไปยังไดเร็กทอรีของแอพของคุณ

  3. พิมพ์สิ่งนี้:

    dotnet compile --native
    

แค่นั้นแหละ! เมื่อคุณทำเสร็จแล้วแอปของคุณจะถูกคอมไพล์เป็นไบนารีเดียวดังนี้:

NET Core EXE ที่คอมไพล์แล้ว

มันจะเป็นปฏิบัติการแบบสแตนด์อโลน ไม่มีไฟล์ PDB แอสเซมบลีหรือไฟล์กำหนดค่า (ไชโย!)


หรือหากคุณต้องการโปรแกรมที่เร็วยิ่งขึ้นคุณสามารถเรียกใช้สิ่งนี้:

dotnet compile --native --cpp

ซึ่งจะเพิ่มประสิทธิภาพโปรแกรมของคุณโดยใช้โปรแกรมสร้างโค้ด C ++ (ตรงข้ามกับ RyuJIT) ดังนั้นแอปของคุณจึงได้รับการปรับให้เหมาะสมกับสถานการณ์ AOT มากยิ่งขึ้น

คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ที่ dotnet CLI GitHub repo


หมายเหตุ: รองรับเฉพาะโครงการที่สร้างด้วย. NET Core (+1 แม้ว่า)
Mahmoud Al-Qudsi

คุณลืมรายละเอียดที่สำคัญมากที่. NET Native ต้องการ Windows 10
Elmue

1
ดูเหมือนว่าจะไม่ทำงานกับ. net core 3.1 การอัปเดตใด ๆ ?
user1005462

19

ฉันได้ทดสอบหลายรายการและในขณะนี้สิ่งเดียวที่รองรับ. NET 3.5 และยังมีสแต็คการจำลองเสมือนที่ยอดเยี่ยมคือXenocode Postbuild

ด้วย ngen คุณยังคงต้องติดตั้ง. NET framework แต่การใช้เครื่องมือเช่นนี้โค้ดที่มีการจัดการทั้งหมดของคุณจะถูกคอมไพล์เป็นโค้ดเนทีฟเพื่อให้คุณสามารถปรับใช้กับเครื่องได้โดยไม่ต้องมีเฟรมเวิร์ก


19

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


11

ใช่โดยใช้Ngenซึ่งเป็น Native Image Generator อย่างไรก็ตามมีหลายสิ่งที่คุณต้องระวัง:

  • คุณยังต้องใช้ CLR เพื่อเรียกใช้ไฟล์ปฏิบัติการของคุณ
  • CLR จะไม่ปรับแต่งแอสเซมบลีของคุณให้เหมาะสมแบบไดนามิกตามสภาพแวดล้อมที่รันอยู่ (เช่น 486 เทียบกับ 586 เทียบกับ 686 เป็นต้น)

สรุปแล้วการใช้ Ngen จะคุ้มค่าหากคุณต้องการลดเวลาเริ่มต้นของแอปพลิเคชัน


9

คุณสามารถ! อย่างไรก็ตามคุณถูก จำกัด ไว้ที่. NET 1.1 (ไม่มีชื่อสามัญสำหรับคุณ): การ รวบรวม Mono Ahead-Of-Time (AOT)

อย่างไรก็ตามนี่หมายความว่าการคอมไพล์นั้นเป็นแบบเนทีฟจริงๆดังนั้นคุณจะไม่สามารถใช้งานแอสเซมบลี bytecode เดียวได้อีกต่อไปคุณจะต้องใช้หนึ่งตัวต่อแพลตฟอร์ม

เดิมถูกออกแบบมาเนื่องจากไม่มี. NET หรือ Mono สำหรับ iPhone ดังนั้นจึงเป็นวิธีที่พวกเขาสร้าง MonoTouch


6

คุณสามารถทำได้โดยใช้เทคโนโลยีการรวบรวมข้อมูลล่วงหน้าใหม่ที่เรียกว่า. 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 เกี่ยวกับสถานการณ์แบบไดนามิกที่ต้องการสนับสนุน


1
+1 - ฉันรอคอยสิ่งนี้มาหลายปีแล้ว ฉันหวังว่าการหลงไหลของโลกด้วย "Virtual Machine" จะดำเนินไปอย่างรวดเร็ว แต่ถึงกระนั้นมันกำลังเกิดขึ้น ฉันคาดว่าเรากำลังจะได้เห็นการฟื้นตัวของการรวบรวมแบบพื้นเมือง ดังที่คุณกล่าวไว้สำหรับแอพ Store ของ Window ในขณะนี้ แต่ก็เป็นเพียงเรื่องของเวลาก่อนที่ตลาดเดสก์ท็อปจะต้องการการปฏิบัติที่เท่าเทียมกัน
codenheim

4

คุณสามารถใช้ ngen.exe เพื่อสร้างอิมเมจดั้งเดิมได้แต่คุณยังต้องแจกจ่ายโค้ดดั้งเดิมที่ไม่ใช่เนทีฟด้วยและยังต้องใช้เฟรมเวิร์กที่ติดตั้งบนเครื่องเป้าหมาย

ซึ่งไม่สามารถแก้ปัญหาของคุณได้จริงๆ


2

2019 คำตอบ: ใช้dotnet / corert สามารถคอมไพล์โครงการ. NET Core เป็น.exeไฟล์แบบสแตนด์อโลน ไม่มีการอ้างอิง (ยกเว้นไลบรารีระบบเช่นkernel32.dll) ฉันพนันได้เลยว่านี่คือสิ่งที่ OP ต้องการ

จากหน้าแรกของ GitHub:

คอมไพเลอร์ CoreRT สามารถคอมไพล์แอ็พพลิเคชัน. NET Core ที่มีการจัดการลงในไฟล์ปฏิบัติการไฟล์เดียวแบบเนทีฟ (เฉพาะสถาปัตยกรรม) ซึ่งง่ายต่อการปรับใช้ นอกจากนี้ยังสามารถสร้างไลบรารีไดนามิกหรือสแตติกแบบสแตนด์อโลนที่แอปพลิเคชันที่เขียนด้วยภาษาโปรแกรมอื่น ๆ สามารถใช้ได้


repo ถูกเก็บถาวรและแทนที่ในขณะนี้
user541686

1

ลักษณะของ. NET คือสามารถติดตั้งแอปที่คอมไพล์ไปยัง MSIL ได้จากนั้นโดย JIT หรือ Ngen MSIL จะถูกคอมไพล์เป็นโค้ดเนทีฟและเก็บไว้ในแคช ไม่เคยมีจุดมุ่งหมายในการสร้าง. exe แบบเนทีฟจริงที่สามารถรันได้โดยไม่ขึ้นกับ. NET framework

อาจมีแฮ็คบางอย่างที่ทำสิ่งนี้ได้ แต่ฟังดูไม่ปลอดภัยสำหรับฉัน มีพลวัตมากเกินไปที่ต้องการเฟรมเวิร์กเช่นการโหลดแอสเซมบลีแบบไดนามิกการสร้างโค้ด MSIL เป็นต้น


0

เหตุผลหลักในการคอมไพล์เป็น Native คือเพื่อรักษาความปลอดภัยของโค้ดของคุณมิฉะนั้นการคอมไพล์ MSIL ก็เหมือนกับการปรับใช้ซอร์สโค้ดในเครื่องของไคลเอ็นต์

NGEN รวบรวมเป็นเนทีฟ แต่ยังต้องปรับใช้รหัส IL จุดประสงค์นี้เป็นเพียงเพื่อลดเวลาในการเริ่มต้น แต่ก็ไร้ประโยชน์เช่นกัน

CoreRt เป็นเวอร์ชันอัลฟาและใช้งานได้เฉพาะกับแอปประเภท helloworld แบบธรรมดาเท่านั้น

.Net Core รวบรวมเป็นไฟล์ปฏิบัติการไฟล์เดียว แต่ยังไม่ใช่ exe ดั้งเดิมนี่เป็นเพียงไฟล์ซิปของรหัส IL และจะคลายซิปรหัสลงในโฟลเดอร์ชั่วคราวในขณะที่ทำงาน

คำถามง่ายๆของฉันจาก Microsoft คือถ้า RyuJIT สามารถรวบรวม IL เป็นเนทีฟได้ทันทีทำไมคุณไม่สามารถรวบรวม IL แบบเดียวกันล่วงหน้า (AOT) ได้


"CoreRt เป็นเวอร์ชันอัลฟาและใช้งานได้เฉพาะกับแอปประเภท helloworld แบบธรรมดาเท่านั้น" สิ่งนี้ไม่เป็นความจริง - มีเกมบน Steam (เช่นstreet4rage.com ) ซึ่งซับซ้อนกว่า helloworld
S Waye

แต่ CoreRT ไม่สามารถรวบรวมแอปพลิเคชัน Winform ใด ๆ ฉันพบคอมไพเลอร์ออนไลน์อื่นที่สามารถรวบรวมแอปพลิเคชัน Winform ( dotnetnative.online )
Rahim Surani

0

ดูเหมือนว่าโซลูชันที่ใช้งานได้ของ 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 เก่าที่เป็นไปได้ทำคล้ายกัน



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.