วัตถุประสงค์ของการตั้งค่า“ 32 บิตแบบพิเศษ” ใน Visual Studio คืออะไรและใช้งานได้จริงอย่างไร


204

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

ไม่มีความชัดเจนสำหรับฉันว่าคอมไพเลอร์จะรู้การรวบรวม 64 บิตโดยอัตโนมัติอย่างไรเมื่อต้องการ จะทราบได้อย่างไรว่าสามารถกำหนดเป้าหมายไปที่ 32 บิตได้อย่างมั่นใจ

ฉันส่วนใหญ่สงสัยว่าคอมไพเลอร์รู้ว่าสถาปัตยกรรมใดที่ต้องกำหนดเป้าหมายเมื่อรวบรวม มันวิเคราะห์รหัสและตัดสินใจตามสิ่งที่พบหรือไม่



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

คำตอบ:


219

Microsoft มีรายการบล็อกAnyCPU หมายถึงอะไรจริงๆ ณ . NET 4.5 และ Visual Studio 11 :

ใน. NET 4.5 และ Visual Studio 11 ชีสถูกย้าย ค่าเริ่มต้นสำหรับโครงการ. NET ส่วนใหญ่คือ AnyCPU อีกครั้ง แต่มีมากกว่าหนึ่งความหมายต่อ AnyCPU ในขณะนี้ มีประเภทย่อยเพิ่มเติมของ AnyCPU“ ใด ๆ ที่ต้องการ CPU แบบ 32 บิต” ซึ่งเป็นค่าเริ่มต้นใหม่ (โดยรวมขณะนี้มีห้าตัวเลือกสำหรับสวิตช์คอมไพเลอร์ / แพลตฟอร์ม C #: x86, Itanium, x64, anycpu และ anycpu32bitpreferred ) เมื่อใช้ "Prefer 32-Bit" รสของ AnyCPU ความหมายมีดังนี้:

  • หากกระบวนการทำงานบนระบบ Windows แบบ 32 บิตกระบวนการนั้นจะทำงานแบบกระบวนการแบบ 32 บิต IL ถูกคอมไพล์เป็นรหัสเครื่อง x86
  • หากกระบวนการทำงานบนระบบ Windows 64 บิตกระบวนการนั้นจะทำงานเป็นกระบวนการแบบ 32 บิต IL ถูกคอมไพล์เป็นรหัสเครื่อง x86
  • หากกระบวนการทำงานบนระบบ ARM Windows จะทำงานเป็นกระบวนการแบบ 32 บิต IL ถูกคอมไพล์เป็นรหัสเครื่อง ARM

ความแตกต่างระหว่าง“ ใด ๆ ที่ต้องการ CPU 32 บิต” และ“ x86” เป็นเพียงสิ่งนี้: แอปพลิเคชัน. NET ที่คอมไพล์ไปที่ x86 จะไม่สามารถทำงานบนระบบ ARM Windows ได้ แต่แอปพลิเคชั่น“ ใด ๆ ที่ต้องการ CPU 32 บิต” จะทำงานได้สำเร็จ


12
+1 นอกจากนี้ช่องทำเครื่องหมาย "ชอบ 32 บิต" จะเปิดใช้งานสำหรับโครงการที่เรียกทำงานได้ NET 4.5+ เท่านั้น
Lee Grissom

12
ข้อดีอีกอย่างของ anycpu32bitspreferred คือว่า. exe อีกตัวที่ทำงานใน 64 บิตสามารถโหลดชุดประกอบนั้นได้
บรูโน่มาร์ติเนซ

30
โดยส่วนตัวฉันคิดว่ามันน่ากลัวที่พวกเขาตั้งค่านี้โดยค่าเริ่มต้นโดยไม่มีการตั้งค่าเครื่องมือให้ปิด ยิ่งไปกว่านั้นคุณไม่สามารถค้นหาได้เนื่องจากไม่ได้อยู่ในไฟล์ csproj ยกเว้นว่าปิดไว้! อาจมีการเพิ่มเนื่องจากความเข้ากันไม่ได้ของ Office Automation กับ CPUAny บนเครื่อง x64 ที่มีคนส่วนใหญ่ติดตั้ง Office 32 บิต
เดฟ

6
@BrianDavidBerman นั่นคือถ้าคุณตั้งค่าเท็จเป็น 32- แต่ต้องการและตั้ง x64 หรือ CPU ใด ๆ บนเครื่อง 64 บิต
Lex Li

6
ความแตกต่างระหว่าง x86 และใด ๆ ที่ต้องการของ CPU 32 บิตคือในกรณีหลังการตั้งค่าสถานะที่มีขนาดใหญ่ที่ตั้งอยู่บนปฏิบัติการ ซึ่งหมายความว่ากระบวนการ 32 บิตที่ทำงานบนระบบปฏิบัติการ 64 บิตสามารถใช้หน่วยความจำ 2GB ในโหมด x86 และหน่วยความจำ 4GB ในโหมดที่ต้องการ CPU 32 บิตใด ๆ
Nic

6

นี่คือคำตอบง่ายๆ:

Application arch

หมายเหตุ: AnyCPU-32bitPreferred นั้นมีเฉพาะใน. Net เวอร์ชัน 4.5 และสูงกว่า


2
อะไรคือความแตกต่างระหว่าง "ทำงานเป็น 32 บิต" กับทำงานเป็น "WoW64" ฉันคิดว่า WoW64 = "Windows (32 บิต) บน Windows64" และจำเป็นสำหรับแอปพลิเคชัน 32 บิตใด ๆ ที่จะเรียกใช้
Peter Cordes

มีแหล่งที่มานี้หรือไม่? ดูเหมือนว่าทุกที่อื่นยังบอกฉันว่าค่าเริ่มต้นคือ anycpu32bitpreferred ซึ่งแตกต่างกันอย่างมากสำหรับผู้ที่ใช้งานบนเครื่อง windows 64 บิต (นั่นเป็นจำนวนมาก)
Ran Sagy

@RanSagy คุณสามารถทดสอบได้โดยการสร้างโครงการใหม่และตรวจสอบProject -> Properties -> Build tab -> Platform target... แต่โปรดทราบว่าAnyCPU-32bitPreferredมีเฉพาะใน. Net เวอร์ชัน 4.5 ขึ้นไป AnyCPUนั่นเป็นเหตุผลที่เริ่มต้นคือ
Yousha Aleayoub

ในบางกรณีเหมืองของฉันเป็นสีเทา ฉันแค่หวังว่าจะมีเอกสารบางอย่างเกี่ยวกับสิ่งที่เกิดขึ้นใน. net 4.5+ หรือ. net standard / core (หรือจริงๆ MSBuild 16)
Ran Sagy

-1

เหตุผลก็คือ: ในกรณีที่คุณไม่ต้องการใช้หน่วยความจำเพิ่มเติมด้วยแอพพลิเคชั่น 64 บิต ซึ่งหมายความว่าหากแอปพลิเคชันของคุณคือAnyCPUคุณต้องการรันเป็น 32 บิต

หากต้องการเพิ่มมากขึ้นการตั้งค่าใน Visual Studio จะกำหนดเป้าหมาย CLR เฉพาะ:

Visual Studio ติดตั้ง CLR เวอร์ชั่น 32 บิตบนคอมพิวเตอร์ x86 และทั้งรุ่น 32 บิตและ CLR รุ่น 64 บิตที่เหมาะสมบนคอมพิวเตอร์ Windows 64 บิต (เนื่องจาก Visual Studio เป็นแอปพลิเคชัน 32 บิตเมื่อติดตั้งบนระบบ 64 บิตจึงทำงานภายใต้ WOW64)

โปรดอ้างอิงบทความแอพพลิเคชั่น 64- บิต ( MSDN )


1
ฉันไม่แน่ใจว่าถูกต้อง เป็นความเข้าใจของฉันว่า. NET executables คำนึงถึง 32 หรือ 64 ยังคง จำกัด ประมาณ 2 GB ต่อกระบวนการ
JP Richardson

1
แก้ไขคำตอบของฉัน แต่ไม่แน่ใจว่านี่คือสิ่งที่คุณกำลังมองหาหรือไม่ :)
เปรู

2
@Aaron คอมไพเลอร์ตั้งค่าสถานะสำหรับรันไทม์เพื่อตัดสินใจว่าจะโหลดชุดประกอบ (เช่นชุดประกอบบล็อก x86 เท่านั้นที่จะโหลดในกระบวนการ x64) และวิธีเริ่มต้นกระบวนการ (สำหรับ EXE ใหม่) ตามธง ฉันเชื่อว่า IL นั้นเหมือนกันทั้งสองรสชาติ
Alexei Levenkov

1
@JPRichardson ใช่คุณพูดถูก แต่ใน. net 4.5 คุณมีตัวเลือกเพื่อเพิ่มขนาด ดูMSDN
เปรู

40
@JPRichardson ไม่สามารถประมวลผลได้ 32 หรือ 64 บิต. สุทธิ จำกัด ที่ 2GB ต่อกระบวนการ - อันดับแรกของพื้นที่ที่อยู่ต่อกระบวนการคือการ จำกัด ระดับ OS (2/3 + GB สำหรับกระบวนการ 32 บิตและอีกมากสำหรับ 64 บิต) รุ่นที่สองแม้แต่ 32 บิต ใช้มากกว่า 2GB หากตั้งค่าสถานะ "LargeAddressAware" ในไฟล์เรียกทำงาน ข้อ จำกัด 2GB เท่านั้นที่ฉันรู้เกี่ยวกับขนาดอาร์เรย์ / การจัดสรรที่ถูก จำกัด โดยช่วง Int32 (ประมาณ 2GB)
Alexei Levenkov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.