รหัสที่ได้รับการจัดการหรือไม่มีการจัดการในการเขียนโปรแกรมคืออะไร


150

ฉันใช้คำสั่งเฉพาะในรหัส C # ซึ่งใช้งานได้ดี อย่างไรก็ตามมีการกล่าวกันว่าการทำงานผิดปกติในรหัส "ไม่มีการจัดการ"

รหัสที่ได้รับการจัดการหรือไม่มีการจัดการคืออะไร


คำตอบ:


75

นี่คือข้อความบางส่วนจาก MSDN เกี่ยวกับการเป็นรหัสที่ไม่มีการจัดการ

รหัสไลบรารีบางตัวต้องเรียกใช้เป็นรหัสที่ไม่มีการจัดการ (ตัวอย่างเช่น API เนทีฟรหัสเช่น Win32) เนื่องจากนี่หมายถึงการออกนอกขอบเขตความปลอดภัยสำหรับรหัสที่ได้รับการจัดการจึงจำเป็นต้องมีการระมัดระวัง

นี่คือคำอธิบายอภินันทนาการอื่น ๆ เกี่ยวกับรหัสที่มีการจัดการ:

  • รหัสที่ดำเนินการโดย CLR
  • รหัสที่กำหนดเป้าหมายรันไทม์ภาษาทั่วไปซึ่งเป็นรากฐานของ. NET Framework เรียกว่ารหัสที่ได้รับการจัดการ
  • รหัสที่มีการจัดการจะให้ข้อมูลเมตาที่จำเป็นสำหรับ CLR เพื่อให้บริการต่างๆเช่นการจัดการหน่วยความจำการรวมข้ามภาษาความปลอดภัยในการเข้าถึงรหัสและการควบคุมอายุการใช้งานของวัตถุโดยอัตโนมัติ รหัสทั้งหมดขึ้นอยู่กับ IL ดำเนินการเป็นรหัสที่ได้รับการจัดการ
  • รหัสที่ดำเนินการภายใต้สภาพแวดล้อมการดำเนินการ CLI

สำหรับปัญหาของคุณ:

ฉันคิดว่าเป็นเพราะ NUnit รันโค้ดของคุณสำหรับ UnitTesting และอาจมีบางส่วนที่ไม่มีการจัดการ แต่ฉันไม่แน่ใจเกี่ยวกับเรื่องนี้ดังนั้นอย่านำสิ่งนี้ไปเป็นทอง ฉันมั่นใจว่าจะมีคนให้ข้อมูลเพิ่มเติมแก่คุณ หวังว่ามันจะช่วย!


12
ฉันขอขอบคุณที่พยายามตอบคำถามของคุณ แต่ผู้ที่ไม่ทราบว่า "รหัสที่จัดการคืออะไร" จะต่อสู้กับสิ่งที่คุณหมายถึงในคำตอบของคุณ: พวกเขาจะไม่ทราบว่า: "รหัสห้องสมุด", "รหัสที่ไม่มีการจัดการ", "API รหัสพื้นเมือง", CLR พื้นฐานของ. net framework, IL, CLI และสภาพแวดล้อมในการดำเนินการอื่น ๆ
BKSpurgeon

200

นี่เป็นบทความที่ดีเกี่ยวกับเรื่องนี้

เพื่อสรุป

  1. รหัสที่มีการจัดการจะไม่ถูกรวบรวมไปยังรหัสเครื่อง แต่เป็นภาษากลางซึ่งถูกตีความและดำเนินการโดยบริการบางอย่างบนเครื่องและดังนั้นจึงทำงานในกรอบความปลอดภัย (หวังว่า!) ซึ่งจัดการสิ่งอันตรายเช่นหน่วยความจำและเธรดสำหรับคุณ ในการใช้งานที่ทันสมัยนี้มักหมายถึง. NET แต่ไม่จำเป็นต้อง

แอปพลิเคชันโปรแกรมที่ทำงานภายในเอ็นจิ้นรันไทม์ที่ติดตั้งในเครื่องเดียวกัน แอปพลิเคชันไม่สามารถทำงานได้หากไม่มี สภาวะแวดล้อมรันไทม์จัดเตรียมไลบรารีทั่วไปของรูทีนซอฟต์แวร์ที่โปรแกรมใช้และโดยทั่วไปจะทำการจัดการหน่วยความจำ นอกจากนี้ยังอาจให้การแปลงแบบ Just-in-time (JIT) จากซอร์สโค้ดเป็นโค้ดที่ใช้งานได้หรือจากภาษาระดับกลางเป็นโค้ดที่ทำงานได้ Java, Visual Basic และ Common Language Runtime (CLR) เป็นตัวอย่างของเอ็นจิ้นรันไทม์ ( อ่านเพิ่มเติม )

  1. รหัสที่ไม่ได้รับการจัดการจะถูกคอมไพล์ไปยังรหัสเครื่องและดำเนินการโดยระบบปฏิบัติการโดยตรง ดังนั้นจึงมีความสามารถในการทำความเสียหาย / สิ่งที่มีประสิทธิภาพรหัสการจัดการไม่ได้ นี่คือวิธีที่ทุกอย่างใช้ในการทำงานดังนั้นโดยทั่วไปจะเกี่ยวข้องกับสิ่งเก่าเช่น. dll

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

  1. รหัสเนทีมักมีความหมายเหมือนกันกับ Unmanaged แต่ไม่เหมือนกัน

คุณหมายถึงว่าในการแฮ็คเราไม่สามารถใช้. Net แคปเจอร์ (C #, C ++) ใช่ไหม
Haroon A.

7
@H_wardak คุณนิยามว่า 'แฮ็ค' คืออะไร มันเป็นคำทั่วไปมากมันเหมือนกับว่าการแฮ็คเข้าสู่ NORAD และการแฮ็คการลงทะเบียนบางอย่างเหมือนกัน
อเล็กซ์

7
ฉันเคยถูกถามโดยผู้สัมภาษณ์เราสามารถเรียกใช้ / เขียนรหัสที่ไม่มีการจัดการใน C # ได้หรือไม่? ใครช่วยได้บ้าง
RSB

9
@RSB: คุณไม่สามารถเขียนรหัสที่ไม่มีการจัดการใน C # (แม้ว่าคุณจะสามารถโทรหารหัสที่ไม่ได้รับการจัดการโดยตรงจาก C #) ในทางทฤษฎีด้วยคอมไพเลอร์และกรอบที่ถูกต้องคุณสามารถทำได้ฉันเดา ในทางปฏิบัตินั่นหมายความว่าคุณต้องการคอมไพเลอร์ที่สามารถคอมไพล์ C # กับรหัสเครื่องได้โดยตรง ไม่แน่ใจว่ามันจะทำงานอย่างไร
James Haug

67

เมื่อคุณคิดถึงการจัดการให้คิดรหัสเฉพาะระดับเครื่อง เหมือนภาษาแอสเซมบลี x86 โค้ดที่ไม่ได้รับการจัดการจะถูกรวบรวมและเชื่อมโยงเพื่อรันโดยตรงบนโปรเซสเซอร์ที่ได้รับการออกแบบมาเพื่อไม่รวมระบบปฏิบัติการทั้งหมดในขณะนี้ มันไม่ได้พกพา แต่รวดเร็ว ง่ายมากถอดรหัสลง

รหัสที่ได้รับการจัดการคือทุกอย่างตั้งแต่ Java ไปจนถึง Interpretive BASIC หรืออะไรก็ตามที่ทำงานภายใต้. NET โดยทั่วไปโค้ดที่มีการจัดการจะถูกรวบรวมเป็นชุดคำสั่ง P-Code ระดับกลางหรือรหัสไบต์ คำแนะนำเหล่านี้ไม่ใช่คำแนะนำเฉพาะของเครื่องแม้ว่าจะดูคล้ายกับภาษาแอสเซมบลี รหัสที่มีการจัดการป้องกันโปรแกรมจากเครื่องที่กำลังทำงานอยู่และสร้างขอบเขตความปลอดภัยซึ่งหน่วยความจำทั้งหมดถูกจัดสรรทางอ้อมและโดยทั่วไปคุณไม่สามารถเข้าถึงทรัพยากรของเครื่องโดยตรงเช่นพอร์ตพื้นที่ที่อยู่หน่วยความจำสแต็ก ฯลฯ แนวคิดคือการทำงานในสภาพแวดล้อมที่ปลอดภัยยิ่งขึ้น

ในการแปลงจากตัวแปรที่ได้รับการจัดการพูดไปยังตัวแปรที่ไม่มีการจัดการคุณต้องไปที่วัตถุจริง มันอาจจะห่อหรือบรรจุในกล่องเพิ่มเติม ตัวแปรที่ไม่มีการจัดการ (เช่น 'int', พูด) - บนเครื่อง 32 บิต - ใช้เวลา 4 ไบต์อย่างแน่นอน ไม่มีค่าใช้จ่ายหรือบรรจุภัณฑ์เพิ่มเติม กระบวนการเปลี่ยนจากการจัดการเป็นรหัสที่ไม่มีการจัดการ - และย้อนกลับอีกครั้ง - เรียกว่า " marshaling " ช่วยให้โปรแกรมของคุณข้ามขอบเขต


1
mashalling โต้ตอบกับค่าและประเภทการอ้างอิงอย่างไร ฉันจำได้ว่าเห็นบางสิ่งเกี่ยวกับ MarshalByRefObject
Kyle Baran

24

ในคำไม่กี่คำที่เป็นไปได้:

  • managed code = โปรแกรม. NET
  • รหัสที่ไม่มีการจัดการ = "ปกติ" โปรแกรม

16
โปรแกรม. NET นั้น "ปกติ" หรือไม่?
jtate

1
@jtate - นั่นทำให้มันลดน้อยลงใช่ :) ฉันพยายามทำให้ใช้งานง่ายขึ้น อย่างไรก็ตามนั่นเป็นเวลากว่า 8 ปีมาแล้ว วันนี้ด้วยภาษาโปรแกรมจำนวนมากที่ใช้กันทั่วไปในชีวิตประจำวันความแตกต่างนี้แน่นอนยิ่งกว่านั้นแน่นอน
Vilx-

5

รหัสที่มีการจัดการคือสิ่งที่ C # .Net, VB.Net, F # .Net คอมไพเลอร์ ฯลฯ สร้าง มันทำงานบน CLR ซึ่งเหนือสิ่งอื่นใดให้บริการเช่นการเก็บขยะและการตรวจสอบการอ้างอิงและอื่น ๆ อีกมากมาย ดังนั้นคิดว่าเป็นรหัสของฉันจัดการโดย CLR

ในทางกลับกันโค้ดที่ไม่ได้รับการจัดการจะรวบรวมข้อมูลตรงกับรหัสเครื่อง มันไม่ได้จัดการโดย CLR


4

รหัสที่ไม่มีการจัดการโดยทั่วไปคือรหัสที่ไม่ได้ทำงานภายใต้. NET CLR (หรือที่เรียกว่าไม่ใช่ VB.NET, C # ฯลฯ ) ฉันเดาว่า NUnit มีนักวิ่ง / ผู้ห่อหุ้มซึ่งไม่ใช่รหัส. NET (aka C ++)


4

Managed Code:
รหัสที่ทำงานภายใต้ "สัญญาความร่วมมือ" กับ runtime ภาษาทั่วไป รหัสที่มีการจัดการต้องระบุข้อมูลเมตาที่จำเป็นสำหรับรันไทม์เพื่อให้บริการเช่นการจัดการหน่วยความจำการรวมข้ามภาษาความปลอดภัยในการเข้าถึงรหัสและการควบคุมอายุการใช้งานของวัตถุโดยอัตโนมัติ รหัสทั้งหมดขึ้นอยู่กับ Microsoft ตัวกลางภาษา (MSIL) ดำเนินการเป็นรหัสที่ได้รับการจัดการ

รหัสที่ไม่มีการจัดการ:
รหัสที่สร้างขึ้นโดยไม่คำนึงถึงข้อกำหนดและข้อกำหนดของการใช้งานจริงของรันไทม์ภาษา รหัสที่ไม่มีการจัดการจะดำเนินการในสภาพแวดล้อมรันไทม์ภาษาทั่วไปที่มีบริการขั้นต่ำ (ตัวอย่างเช่นไม่มีการรวบรวมขยะการดีบักแบบ จำกัด และอื่น ๆ )

การอ้างอิง: http://www.dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx


3

NUnit โหลดการทดสอบหน่วยใน AppDomain แยกกันและฉันคิดว่าจุดเข้าใช้งานไม่ได้ถูกเรียก


2

รหัสที่ได้รับการจัดการจะทำงานภายในสภาพแวดล้อมของ CLR เช่น. NET runtime โดยย่อ IL ทั้งหมดจะได้รับการจัดการรหัส แต่ถ้าคุณใช้ซอฟต์แวร์บุคคลที่สามบางตัวอย่างเช่น VB6 หรือ VC ++ ส่วนประกอบพวกเขาเป็นรหัสที่ไม่มีการจัดการเนื่องจาก. NET runtime (CLR) เหนือการเรียกใช้งานซอร์สโค้ดของภาษา


1

Managed Code: - รหัสที่รูปแบบ MSIL (ภาษากลาง) ได้รับการพัฒนาหลังจากการรวบรวมคอมไพเลอร์ภาษาและดำเนินการโดยตรงโดยCLRเรียกว่ารหัสที่ได้รับการจัดการ เช่น: - รหัสภาษาทั้งหมด 61 ภาษาที่รองรับโดย. net framework

รหัสที่ไม่มีการจัดการ: - รหัสที่พัฒนามาก่อน.netซึ่งรูปแบบ MSIL ไม่พร้อมใช้งานและถูกดำเนินการโดยCLRโดยตรงแทนCLRเปลี่ยนเส้นทางไปยังระบบปฏิบัติการซึ่งเป็นที่รู้จักกันในชื่อรหัสที่ไม่มีการจัดการ

เช่น: -COM, Win32 APIs


มีข้อผิดพลาดจำนวนมากในโพสต์นี้ MISL ที่เห็นได้ชัดที่สุด (คุณหมายถึง MSIL)
Matt Seymour

1
  • Managed Code: รหัสที่เขียนด้วยภาษา. NET เช่น C #, VB.NET
  • ไม่มีการจัดการรหัส: รหัสไม่ได้เขียนในภาษา NET และ MSIL ไม่เข้าใจว่ามันคืออะไรและไม่สามารถทำงานภายใต้ CLR; เช่นการควบคุมโดยบุคคลที่สามที่เราใช้ในแอปพลิเคชั่น. NET ของเราซึ่งไม่ได้สร้างขึ้นในภาษา. NET

0

ครั้งแรกของทุกคนเข้าใจนี้ก่อน.NET framework, Microsoftได้รับการให้บริการผลิตภัณฑ์ที่ยืนอยู่คนเดียวเหมือนMFC (Visual C++), VB, FoxProฯลฯ

ในปี 2002 Microsoft ได้รวมผลิตภัณฑ์และสร้าง. NET Framework ขณะนี้มีความแตกต่างระหว่างวิธีการเรียกใช้รหัสมาก่อนและวิธีการจัดการและเรียกใช้รหัสในกรอบงาน. NET Microsoft แนะนำแนวคิดCLRด้วย. NET framework ซึ่งรวบรวมรหัสที่มาจาก lanugague ใด ๆ ที่ได้รับการสนับสนุนของ. NET Framework และมีฟังก์ชันเพิ่มเติมเช่นmemory mangement, garbage collectionฯลฯ แต่คุณสมบัติ CLR ดังกล่าวไม่สามารถใช้ได้โดยตรงก่อน

ดังนั้นหากคุณกำลังสร้างManaged codeไลบรารี่ / รหัสใน. NET Framework (คอมไพล์ด้วย CLR) ดังนั้นสิ่งที่เรียกว่า คุณสามารถใช้ไลบรารีนี้เพิ่มเติมในแอปพลิเคชั่น / โครงการ. NET อื่น ๆ และที่นั่น CLR จะเข้าใจวิธีการรวบรวมก่อนหน้านี้และนั่นคือสาเหตุที่ยังคงรหัสการจัดการของคุณ

OTOH ถ้าคุณต้องการใช้ไลบรารีที่เขียนก่อน. NET Framework คุณสามารถทำได้ด้วยข้อ จำกัด บางอย่าง แต่โปรดจำไว้ว่าเนื่องจาก CLR ไม่ได้มีอยู่ในขณะนั้นดังนั้นตอนนี้ CLR จะไม่เข้าใจและรวบรวมรหัสนี้อีก . unmanaged codeและสิ่งนี้จะถูกเรียกว่า โปรดทราบว่าไลบรารี / แอสเซมบลีที่สร้างขึ้นโดยบุคคลที่สามเพื่อให้คุณลักษณะ / เครื่องมือบางอย่างอาจถูกพิจารณาว่าเป็นรหัสที่ไม่มีการจัดการถ้าไม่ใช่ CLR compatiblie

ในแง่คนธรรมดาจัดการรหัสเป็นสิ่งที่ CLR ของคุณเข้าใจและสามารถรวบรวมได้ด้วยตนเองเพื่อดำเนินการต่อไป ในกรอบ NET, (ตั้งแต่ thats ภาษาใด ๆ ทำงานใน .NET Framework) เมื่อรหัสไป CLR แล้วอุปทานรหัสข้อมูลบางข้อมูล meta เพื่อให้ CLR สามารถให้คุณมีคุณสมบัติที่ระบุไว้ที่นี่ ไม่กี่ของพวกเขาGarbage collection, Performance improvements, cross-language integration, memory managementฯลฯ

OTOH รหัสไม่เปลี่ยนแปลงเป็นสิ่งเฉพาะสำหรับเครื่องและพร้อมใช้งานไม่จำเป็นต้องดำเนินการเพิ่มเติม


มากมายและจำนวนมากของความคิดเห็นที่ไม่รู้ฉันกลัว สิ่งนี้อาจเป็นเรื่องแปลกใจ แต่ CLR สามารถเรียกใช้งานโค้ดที่ไม่มีการจัดการ (มักเขียนใน C ++ / CLI) เช่นกัน นอกจากนี้ยังไม่มีข้อกำหนดสำหรับรหัสที่จัดการเพื่อให้สามารถใช้ได้ในฐานะ IL . NET Native มีมานานแล้วและมาพร้อมกับชุดประกอบที่รวบรวมไว้ล่วงหน้า สิ่งที่คุณเรียกว่า"CLR เข้ากันได้"อาจจะหมายถึงการเป็น"ตาม CLS" ความล้มเหลวในการปฏิบัติตามข้อกำหนด CLS ไม่ได้ทำให้การจัดการรหัสที่มีการจัดการทั้งหมดในทันที การใช้รหัสที่ไม่มีการจัดการ - แม้จะมีคำอธิบายของคุณ - ก็ทำได้ง่ายเช่นกัน (RCW ผ่าน COM, P / Invoke, C ++ / CLI, ฯลฯ )
IIsspectable

0

จาก Pro C # 5 และ. NET Framework 4.5:

Managed vs. Unmanaged Code: บางทีจุดที่สำคัญที่สุดที่จะเข้าใจเกี่ยวกับภาษา C # ก็คือมันสามารถสร้างโค้ดที่สามารถทำงานได้เฉพาะใน. NET runtime (คุณไม่สามารถใช้ C # ในการสร้างเซิร์ฟเวอร์ COM ดั้งเดิมหรือ C / C ++ ที่ไม่มีการจัดการ ใช้งาน) คำที่ใช้อธิบายรหัสที่กำหนดเป้าหมายในรันไทม์. NET คือรหัสที่ได้รับการจัดการอย่างเป็นทางการ หน่วยไบนารีที่มีรหัสที่ได้รับการจัดการจะเรียกว่าแอสเซมบลี (รายละเอียดเพิ่มเติมเกี่ยวกับการประกอบในเพียงเล็กน้อย) ในทางกลับกันโค้ดที่ไม่สามารถโฮสต์โดยตรงโดยรันไทม์. NET จะเรียกว่าโค้ดที่ไม่มีการจัดการ

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