แอสเซมบลีใน C # หรือ. NET คืออะไร?


107

คุณช่วยอธิบายได้ไหมว่า Assembly ใน C # หรือ. NET คืออะไร

  1. มันเริ่มต้นที่ไหนและสิ้นสุดที่ไหน?
  2. ฉันควรรู้ข้อมูลสำคัญอะไรบ้างเกี่ยวกับแอสเซมบลี

5
พูดอย่างเคร่งครัดการชุมนุมไม่ใช่แนวคิด. NET แทนที่จะเป็นแนวคิด C # หรือไม่?
JeffH

14
@ เจฟฟ์: เมื่อฉันถามคำถามฉันคิดว่ามันเป็นแนวคิด C # ตอนนี้ฉันเข้าใจแล้วว่ามันเป็น. NET อย่างไรก็ตามเนื่องจากฉันคิดว่าคนอื่นอาจสับสนเหมือนฉันฉันตั้งใจไม่เปลี่ยนเพื่อให้ Google รองรับความผิดพลาดนี้ ...
Roee Adler

เป็นแนวคิด C # เช่นกัน คุณต้องทำความเข้าใจเพื่อใช้ตัวแก้ไขการเข้าถึง "ภายใน" อย่างถูกต้อง
Jan Rozycki

คำตอบ:


116

แอสเซมบลีคือเอาต์พุตที่คอมไพล์แล้วของโค้ดของคุณโดยทั่วไปคือ DLL แต่ EXE ของคุณยังเป็นแอสเซมบลี เป็นหน่วยการปรับใช้ที่เล็กที่สุดสำหรับโครงการ. NET

โดยทั่วไปแล้วแอสเซมบลีจะประกอบด้วยรหัส. NET ใน MSIL (ภาษา Microsoft Intermediate) ที่จะถูกคอมไพล์เป็นโค้ดเนทีฟ ("JITted" - คอมไพล์โดยคอมไพเลอร์ Just-In-Time) ในครั้งแรกที่เรียกใช้งานบนเครื่องที่กำหนด โค้ดที่คอมไพล์นั้นจะถูกเก็บไว้ในแอสเซมบลีและใช้ซ้ำในการโทรครั้งต่อ ๆ ไป

แอสเซมบลียังสามารถมีทรัพยากรเช่นไอคอนบิตแมปตารางสตริงและอื่น ๆ นอกจากนี้แอสเซมบลียังมีข้อมูลเมตาในรายการแอสเซมบลี - ข้อมูลเช่นหมายเลขเวอร์ชันชื่อที่แข็งแกร่งวัฒนธรรมแอสเซมบลีที่อ้างอิงและอื่น ๆ

ใน 99% ของเคสของคุณหนึ่งแอสเซมบลีเท่ากับไฟล์ฟิสิคัลบนดิสก์ - เคสของแอสเซมบลีหลายไฟล์ (หนึ่งแอสเซมบลีกระจายมากกว่าไฟล์เดียว) ดูเหมือนจะเป็นเคส edge ที่ค่อนข้างแปลกซึ่งฉัน ไม่เคยพบมาก่อนในช่วง 5 ปีขึ้นไปของการพัฒนา. NET

ในชุดประกอบหลายไฟล์จะยังคงมีรายการประกอบเพียงรายการเดียวใน DLL หรือ EXE และรหัส MSIL ในไฟล์ netmodule หลายไฟล์


1
@marc_s: ฉันคิดว่าคุณหมายถึงไฟล์หลายแอสเซมบลี เป็นไปได้ที่จะรวมหลายแอสเซมบลีไว้ในไฟล์เดียวผ่านเครื่องมือบรรทัดคำสั่งของสตูดิโอ แต่ไม่สามารถทำได้โดยตรงผ่าน IDE
Greg D

5
สิ่งที่สำคัญมากในการประกอบคือข้อมูลเมตาในรายการประกอบ ไฟล์ Manifest มีข้อมูลเช่นเวอร์ชันชื่อที่คาดเดายากวัฒนธรรมแอสเซมบลีที่อ้างอิงเป็นต้นในแอสเซมบลีหลายไฟล์จะยังคงมีรายการแอสเซมบลีเพียงรายการเดียวใน dll หรือ exe และโค้ด MSIL ในไฟล์. netmodule หลายไฟล์ โดยทั่วไปการประกอบเป็นหน่วยขั้นต่ำของการปรับใช้ใน> net
softveda

@marc_s: ฉันจะขอบคุณถ้าคุณเพิ่มประเด็นของ @ Pratik ในคำตอบขอบคุณ
Roee Adler

@rax: เสร็จแล้ว; @pratik: ตอนนี้คุณกำลังสับสนฉัน: คุณพูดถึง "multi-file assembly" อีกครั้งในขณะที่ @GregD กล่าวว่ามันเป็น "ไฟล์หลายไฟล์" ตอนนี้มันคืออะไร ?? (อย่างที่บอก - ฉันไม่เคยเจอสัตว์ร้ายแบบนี้มาก่อนดังนั้นฉันจึงไม่ชัดเจนเล็กน้อยว่ามันเป็นหลายแอสเซมบลีต่อไฟล์หรือหลายไฟล์ต่อแอสเซมบลี .... )
marc_s

3
"โค้ดที่คอมไพล์นั้นจะถูกเก็บไว้ในชุดประกอบและนำกลับมาใช้ในการโทรครั้งต่อ ๆ ไป" สิ่งนี้ทำให้เข้าใจผิดและ / หรือไม่ชัดเจนนัก ไม่มีโค้ดที่คอมไพล์ "เก็บไว้" ในแอสเซมบลี ฉันคิดว่าคุณอาจอ้างถึงวิธีที่แต่ละเมธอด / ฟังก์ชัน "ติด" กับโค้ดเนทีฟเมื่อมีการเรียกครั้งแรก จากนั้นในขณะที่แอสเซมบลีอยู่ในหน่วยความจำจะมีการเรียกใช้เวอร์ชันรหัสดั้งเดิมของเมธอด หากการประกอบถูกยกเลิกการโหลดและโหลดใหม่ในภายหลังกระบวนการ jit จะเกิดขึ้นอีกครั้ง แน่นอนว่าสิ่งนี้ถือว่าคุณไม่ได้ใช้ NGEN ในการคอมไพล์แอสเซมบลีของคุณล่วงหน้ากับโค้ดเนทีฟ (ไม่แนะนำ)
เถ้า

13

.NET ประกอบ

ในกรอบงาน Microsoft .NET แอสเซมบลีคือไลบรารีโค้ดที่คอมไพล์แล้วบางส่วนเพื่อใช้ในการปรับใช้การกำหนดเวอร์ชันและความปลอดภัย


7

http://www.codeguru.com/columns/csharp_learning/article.php/c5845

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


2
แอสเซมบลีแตกต่างจากไฟล์ที่มี
Greg D

1
@Raghav - อัปเดตรูปถ่ายของคุณด้วยสิ่งสบาย ๆ เพื่อสวรรค์! เราไม่ได้โพสต์พาสปอร์ตที่นี่นะรู้ยัง!
Robin Rodricks

4

นี่คือคำอธิบายอีกประการหนึ่งเกี่ยวกับการประกอบ. NET Assemblies คำพูดย่อ:

กรอบงาน. NET ประกอบด้วยแนวคิดของโมดูลแอสเซมบลีซึ่งทั้งเก็บข้อมูลเมตาและข้อมูลรายการ ชุดประกอบสามารถมีหลายโมดูล Visual C # จะสร้างโมดูลเดียวซึ่งกลายเป็นแอสเซมบลีโดยคอมไพเลอร์ C # (csc.exe) แต่แอสเซมบลีสามารถเชื่อมโยงโมดูล. NET จำนวนมากเข้าด้วยกันผ่านเครื่องมือบรรทัดคำสั่งแอสเซมบลีลิงค์เกอร์ (al.exe) ตัวอย่างเช่นไฟล์ซอร์สโค้ด. c แต่ละไฟล์ของคุณสามารถคอมไพล์ลงในโมดูลและเชื่อมโยงเข้าด้วยกันเพื่อสร้างแอสเซมบลี - แอสเซมบลีเป็นเพียงชุดของโมดูลและทรัพยากร อย่างไรก็ตามหนึ่งในโมดูลเหล่านี้ ต้องมีข้อมูลเมตาดาต้าของรายการ (ดูด้านล่าง) เพื่อให้ CLR เข้าใจแอสเซมบลี
....
เมื่อสร้าง. exe หรือ. dll ใหม่ภายใน VS.NET คุณจะเห็นไฟล์ของคุณปรากฏในโฟลเดอร์ถังขยะของคุณ การเปิดใน notepad จะทำให้พูดพล่อยๆหรือแม้กระทั่งในโปรแกรมแก้ไขเลขฐานสิบหกโดยไม่ทราบโครงสร้างของไฟล์คุณต้องมีเครื่องมือเช่น ildasm.exe หรือ CFF explorer เพื่อสร้างความหมายจากมัน โครงสร้างของชุดประกอบมีดังนี้:

ส่วนหัว PE ส่วน
หัว
CLR ข้อมูลเมตา
CLR
รหัสCLR IL
ข้อมูลดั้งเดิม


ลิงค์นั้นพาฉันไปที่ไหน ชนิดของการเปลี่ยนเส้นทางที่ไม่มีที่สิ้นสุด! หลังจากนั้นไม่กี่เปลี่ยนเส้นทางมันเอาฉันไปยังหน้าเว็บที่บอกว่านี้ ไม่มีทางที่จะรับ URL เดิมที่คุณโพสต์เช่นกัน
Sнаđошƒаӽ

3

คำตอบคือเพื่อให้เข้าใจได้ทันที

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

หรือมากกว่าทางเทคนิค

การชุมนุมเป็นที่ที่ชนิดถูกเก็บไว้ใน flesystem แอสเซมบลีเป็นกลไกในการปรับใช้โค้ด ตัวอย่างเช่นSystem.Data.dll แอสเซมบลีประกอบด้วยประเภทสำหรับจัดการข้อมูล ในการใช้ประเภทในแอสเซมบลีอื่นต้องอ้างอิง - ที่มา

เราจะรู้ได้อย่างไร? หากคุณดูคุณสมบัติของโครงการภายใต้โซลูชันคุณจะเห็นภาพต่อไปนี้

เมื่อคุณคอมไพล์โครงการก็จะเปิดออกเพื่อDLLหรือEXE

ป้อนคำอธิบายภาพที่นี่ ป้อนคำอธิบายภาพที่นี่ ป้อนคำอธิบายภาพที่นี่


1

เมื่อซอร์สโค้ดถูกคอมไพเลอร์โดยภาษาคอมไพเลอร์จะสร้างManaged Assemblyและ MSIL (MisroSoft Intermediate Language) ที่สภามีไฟล์ .dll หรือ .exe Assebmly สามารถเป็นได้สองประเภทPrivate AssemblyและShared Assembly แอสเซมบลีที่ใช้ร่วมกันจะถูกเก็บไว้ในGAC (Global Assembly Cache)เพื่อให้แอปพลิเคชันใด ๆ สามารถอ้างถึงได้ในขณะที่แอสเซมบลีส่วนตัวถูกเก็บไว้ในโฟลเดอร์แอปพลิเคชันซึ่งสามารถใช้ได้โดยแอปพลิเคชันเดียวเท่านั้น



0

หลังจากเขียนซอร์สโค้ดของโปรแกรมของคุณ (โครงการ) แล้วไฟล์จะถูกสร้างขึ้นซึ่งอาจเป็น DLL หรือ EXE ขึ้นอยู่กับโครงการของคุณ ทำให้เพียงครั้งเดียวสำหรับโครงการเดียว มีสองประเภท 1: - เดี่ยว 2: - แอสเซมบลีเดี่ยวที่ใช้ร่วมกันหรือหลายโปรแกรมที่ใช้เฉพาะในโปรแกรมเดียวในขณะที่แชร์สามารถใช้สำหรับมัลติโปรแกรม


หลังจากเขียนซอร์สโค้ดของโปรแกรมของคุณ (โปรเจ็กต์) แล้วไฟล์จะถูกสร้างขึ้นซึ่งอาจเป็น DLL หรือ EXE ขึ้นอยู่กับโปรเจ็กต์ของคุณ - หลังจากเขียนซอร์สโค้ดแล้ว? ดูเหมือนจะไม่เป็นตัวบ่งชี้ที่ดีมากว่าเมื่อใดที่ไฟล์นั้นถูกสร้างขึ้นซึ่ง BTW นั้นไม่มีสาระสำคัญสำหรับคำถาม
Sнаđошƒаӽ

0

แอสเซมบลีคือชุดของหน่วยตรรกะ โลจิคัลยูนิตอ้างถึงชนิดและรีซอร์สที่จำเป็นในการสร้างแอ็พพลิเคชันและปรับใช้โดยใช้. Net framework โดยทั่วไป Assembly คือชุดของ Exe และ DLL เป็นแบบพกพาและปฏิบัติการได้

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