ฉันใช้คำสั่งเฉพาะในรหัส C # ซึ่งใช้งานได้ดี อย่างไรก็ตามมีการกล่าวกันว่าการทำงานผิดปกติในรหัส "ไม่มีการจัดการ"
รหัสที่ได้รับการจัดการหรือไม่มีการจัดการคืออะไร
ฉันใช้คำสั่งเฉพาะในรหัส C # ซึ่งใช้งานได้ดี อย่างไรก็ตามมีการกล่าวกันว่าการทำงานผิดปกติในรหัส "ไม่มีการจัดการ"
รหัสที่ได้รับการจัดการหรือไม่มีการจัดการคืออะไร
คำตอบ:
นี่คือข้อความบางส่วนจาก MSDN เกี่ยวกับการเป็นรหัสที่ไม่มีการจัดการ
รหัสไลบรารีบางตัวต้องเรียกใช้เป็นรหัสที่ไม่มีการจัดการ (ตัวอย่างเช่น API เนทีฟรหัสเช่น Win32) เนื่องจากนี่หมายถึงการออกนอกขอบเขตความปลอดภัยสำหรับรหัสที่ได้รับการจัดการจึงจำเป็นต้องมีการระมัดระวัง
นี่คือคำอธิบายอภินันทนาการอื่น ๆ เกี่ยวกับรหัสที่มีการจัดการ:
สำหรับปัญหาของคุณ:
ฉันคิดว่าเป็นเพราะ NUnit รันโค้ดของคุณสำหรับ UnitTesting และอาจมีบางส่วนที่ไม่มีการจัดการ แต่ฉันไม่แน่ใจเกี่ยวกับเรื่องนี้ดังนั้นอย่านำสิ่งนี้ไปเป็นทอง ฉันมั่นใจว่าจะมีคนให้ข้อมูลเพิ่มเติมแก่คุณ หวังว่ามันจะช่วย!
นี่เป็นบทความที่ดีเกี่ยวกับเรื่องนี้
เพื่อสรุป
แอปพลิเคชันโปรแกรมที่ทำงานภายในเอ็นจิ้นรันไทม์ที่ติดตั้งในเครื่องเดียวกัน แอปพลิเคชันไม่สามารถทำงานได้หากไม่มี สภาวะแวดล้อมรันไทม์จัดเตรียมไลบรารีทั่วไปของรูทีนซอฟต์แวร์ที่โปรแกรมใช้และโดยทั่วไปจะทำการจัดการหน่วยความจำ นอกจากนี้ยังอาจให้การแปลงแบบ Just-in-time (JIT) จากซอร์สโค้ดเป็นโค้ดที่ใช้งานได้หรือจากภาษาระดับกลางเป็นโค้ดที่ทำงานได้ Java, Visual Basic และ Common Language Runtime (CLR) เป็นตัวอย่างของเอ็นจิ้นรันไทม์ ( อ่านเพิ่มเติม )
โปรแกรมปฏิบัติการที่รันด้วยตัวเอง เปิดตัวจากระบบปฏิบัติการโปรแกรมเรียกใช้และใช้งานซอฟต์แวร์ตามปกติในระบบปฏิบัติการ แต่ไม่ต้องการให้ใช้ระบบซอฟต์แวร์อื่น โปรแกรมภาษาแอสเซมบลีที่ประกอบเป็นภาษาเครื่องและโปรแกรม C / C ++ ที่คอมไพล์เป็นภาษาเครื่องสำหรับแพลตฟอร์มเฉพาะเป็นตัวอย่างของโค้ดที่ไม่มีการจัดการ ( อ่านเพิ่มเติม )
เมื่อคุณคิดถึงการจัดการให้คิดรหัสเฉพาะระดับเครื่อง เหมือนภาษาแอสเซมบลี x86 โค้ดที่ไม่ได้รับการจัดการจะถูกรวบรวมและเชื่อมโยงเพื่อรันโดยตรงบนโปรเซสเซอร์ที่ได้รับการออกแบบมาเพื่อไม่รวมระบบปฏิบัติการทั้งหมดในขณะนี้ มันไม่ได้พกพา แต่รวดเร็ว ง่ายมากถอดรหัสลง
รหัสที่ได้รับการจัดการคือทุกอย่างตั้งแต่ Java ไปจนถึง Interpretive BASIC หรืออะไรก็ตามที่ทำงานภายใต้. NET โดยทั่วไปโค้ดที่มีการจัดการจะถูกรวบรวมเป็นชุดคำสั่ง P-Code ระดับกลางหรือรหัสไบต์ คำแนะนำเหล่านี้ไม่ใช่คำแนะนำเฉพาะของเครื่องแม้ว่าจะดูคล้ายกับภาษาแอสเซมบลี รหัสที่มีการจัดการป้องกันโปรแกรมจากเครื่องที่กำลังทำงานอยู่และสร้างขอบเขตความปลอดภัยซึ่งหน่วยความจำทั้งหมดถูกจัดสรรทางอ้อมและโดยทั่วไปคุณไม่สามารถเข้าถึงทรัพยากรของเครื่องโดยตรงเช่นพอร์ตพื้นที่ที่อยู่หน่วยความจำสแต็ก ฯลฯ แนวคิดคือการทำงานในสภาพแวดล้อมที่ปลอดภัยยิ่งขึ้น
ในการแปลงจากตัวแปรที่ได้รับการจัดการพูดไปยังตัวแปรที่ไม่มีการจัดการคุณต้องไปที่วัตถุจริง มันอาจจะห่อหรือบรรจุในกล่องเพิ่มเติม ตัวแปรที่ไม่มีการจัดการ (เช่น 'int', พูด) - บนเครื่อง 32 บิต - ใช้เวลา 4 ไบต์อย่างแน่นอน ไม่มีค่าใช้จ่ายหรือบรรจุภัณฑ์เพิ่มเติม กระบวนการเปลี่ยนจากการจัดการเป็นรหัสที่ไม่มีการจัดการ - และย้อนกลับอีกครั้ง - เรียกว่า " marshaling " ช่วยให้โปรแกรมของคุณข้ามขอบเขต
ในคำไม่กี่คำที่เป็นไปได้:
รหัสที่มีการจัดการคือสิ่งที่ C # .Net, VB.Net, F # .Net คอมไพเลอร์ ฯลฯ สร้าง มันทำงานบน CLR ซึ่งเหนือสิ่งอื่นใดให้บริการเช่นการเก็บขยะและการตรวจสอบการอ้างอิงและอื่น ๆ อีกมากมาย ดังนั้นคิดว่าเป็นรหัสของฉันจัดการโดย CLR
ในทางกลับกันโค้ดที่ไม่ได้รับการจัดการจะรวบรวมข้อมูลตรงกับรหัสเครื่อง มันไม่ได้จัดการโดย CLR
รหัสที่ไม่มีการจัดการโดยทั่วไปคือรหัสที่ไม่ได้ทำงานภายใต้. NET CLR (หรือที่เรียกว่าไม่ใช่ VB.NET, C # ฯลฯ ) ฉันเดาว่า NUnit มีนักวิ่ง / ผู้ห่อหุ้มซึ่งไม่ใช่รหัส. NET (aka C ++)
Managed Code:
รหัสที่ทำงานภายใต้ "สัญญาความร่วมมือ" กับ runtime ภาษาทั่วไป รหัสที่มีการจัดการต้องระบุข้อมูลเมตาที่จำเป็นสำหรับรันไทม์เพื่อให้บริการเช่นการจัดการหน่วยความจำการรวมข้ามภาษาความปลอดภัยในการเข้าถึงรหัสและการควบคุมอายุการใช้งานของวัตถุโดยอัตโนมัติ รหัสทั้งหมดขึ้นอยู่กับ Microsoft ตัวกลางภาษา (MSIL) ดำเนินการเป็นรหัสที่ได้รับการจัดการรหัสที่ไม่มีการจัดการ:
รหัสที่สร้างขึ้นโดยไม่คำนึงถึงข้อกำหนดและข้อกำหนดของการใช้งานจริงของรันไทม์ภาษา รหัสที่ไม่มีการจัดการจะดำเนินการในสภาพแวดล้อมรันไทม์ภาษาทั่วไปที่มีบริการขั้นต่ำ (ตัวอย่างเช่นไม่มีการรวบรวมขยะการดีบักแบบ จำกัด และอื่น ๆ )
การอ้างอิง: http://www.dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx
NUnit โหลดการทดสอบหน่วยใน AppDomain แยกกันและฉันคิดว่าจุดเข้าใช้งานไม่ได้ถูกเรียก
รหัสที่ได้รับการจัดการจะทำงานภายในสภาพแวดล้อมของ CLR เช่น. NET runtime โดยย่อ IL ทั้งหมดจะได้รับการจัดการรหัส แต่ถ้าคุณใช้ซอฟต์แวร์บุคคลที่สามบางตัวอย่างเช่น VB6 หรือ VC ++ ส่วนประกอบพวกเขาเป็นรหัสที่ไม่มีการจัดการเนื่องจาก. NET runtime (CLR) เหนือการเรียกใช้งานซอร์สโค้ดของภาษา
Managed Code: - รหัสที่รูปแบบ MSIL (ภาษากลาง) ได้รับการพัฒนาหลังจากการรวบรวมคอมไพเลอร์ภาษาและดำเนินการโดยตรงโดยCLR
เรียกว่ารหัสที่ได้รับการจัดการ เช่น: - รหัสภาษาทั้งหมด 61 ภาษาที่รองรับโดย. net framework
รหัสที่ไม่มีการจัดการ: - รหัสที่พัฒนามาก่อน.net
ซึ่งรูปแบบ MSIL ไม่พร้อมใช้งานและถูกดำเนินการโดยCLR
โดยตรงแทนCLR
เปลี่ยนเส้นทางไปยังระบบปฏิบัติการซึ่งเป็นที่รู้จักกันในชื่อรหัสที่ไม่มีการจัดการ
เช่น: -COM, Win32 APIs
ครั้งแรกของทุกคนเข้าใจนี้ก่อน.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 รหัสไม่เปลี่ยนแปลงเป็นสิ่งเฉพาะสำหรับเครื่องและพร้อมใช้งานไม่จำเป็นต้องดำเนินการเพิ่มเติม
จาก Pro C # 5 และ. NET Framework 4.5:
Managed vs. Unmanaged Code: บางทีจุดที่สำคัญที่สุดที่จะเข้าใจเกี่ยวกับภาษา C # ก็คือมันสามารถสร้างโค้ดที่สามารถทำงานได้เฉพาะใน. NET runtime (คุณไม่สามารถใช้ C # ในการสร้างเซิร์ฟเวอร์ COM ดั้งเดิมหรือ C / C ++ ที่ไม่มีการจัดการ ใช้งาน) คำที่ใช้อธิบายรหัสที่กำหนดเป้าหมายในรันไทม์. NET คือรหัสที่ได้รับการจัดการอย่างเป็นทางการ หน่วยไบนารีที่มีรหัสที่ได้รับการจัดการจะเรียกว่าแอสเซมบลี (รายละเอียดเพิ่มเติมเกี่ยวกับการประกอบในเพียงเล็กน้อย) ในทางกลับกันโค้ดที่ไม่สามารถโฮสต์โดยตรงโดยรันไทม์. NET จะเรียกว่าโค้ดที่ไม่มีการจัดการ