ฉันสามารถใช้ C # 4.0 กับกรอบงานเป้าหมายที่กำหนดเป็น. NET 3.5 เพื่อพัฒนาส่วนขยายสำหรับ ArcMap 9.3 ได้หรือไม่? หรือต้องเป็น C # 3.0 หรือเก่ากว่า
ฉันสามารถใช้ C # 4.0 กับกรอบงานเป้าหมายที่กำหนดเป็น. NET 3.5 เพื่อพัฒนาส่วนขยายสำหรับ ArcMap 9.3 ได้หรือไม่? หรือต้องเป็น C # 3.0 หรือเก่ากว่า
คำตอบ:
คำตอบสั้น ๆ จากประสบการณ์ของฉันไม่ควรมีปัญหาในการพัฒนารหัสที่ใช้. NET 3.5 สำหรับ ArcGIS 9.3 ใน Visual Studio 2010 (ด้วยภาษา C # เวอร์ชัน 4) ตราบใดที่คุณกำหนดเป้าหมาย 3.5 Framework .NET อย่างชัดเจน รุ่นภาษา C # ส่วนใหญ่ไม่เกี่ยวข้องที่นี่
PS:คำตอบนี้ไม่ได้ไปสู่ความแตกต่างที่มีอยู่ระหว่างการพัฒนาส่วนขยาย ArcGIS สำหรับรุ่น 9.3 และ 10 (ESRI ได้ทำการเปลี่ยนแปลงที่สำคัญบางอย่างในรูปแบบของ Add-in แต่ฉันคิดว่าคุณตระหนักถึงสิ่งนั้น .)
คำตอบอีกต่อไป:คุณต้องแยกความแตกต่างระหว่างรุ่นภาษา C # และรุ่นกรอบงานเป้าหมาย
คุณสามารถนึกถึง. NET Framework ซึ่งประกอบด้วยสองส่วนหลักคือ CLR (Common Language Runtime) และ BCL (ไลบรารีคลาสพื้นฐาน) อดีตคือ "เครื่องเสมือน" ในขณะที่หลังเป็นไลบรารีคลาส (มีทุกประเภทที่คุณสามารถค้นหาบน MSDN)
.NET Frameworks 2 จนถึง 3.5 ทั้งหมดใช้ CLR (รุ่น 2) เดียวกันนั่นคือสภาพแวดล้อมการดำเนินการยังไม่ได้รับการพัฒนาจริงๆ อย่างไรก็ตามสิ่งที่ได้รับการพัฒนาขึ้นมาคือ BCL หากคุณใช้แอปพลิเคชั่น. NET 3.5 บนเครื่อง. NET 2 ปัญหาหลักจะไม่เกิดขึ้นว่า "bytecode" (CIL) จะเข้ากันไม่ได้ (ไม่ได้) แต่แอปพลิเคชันอาจอ้างถึงและใช้งาน ประเภทที่ยังไม่พร้อมใช้งานใน. NET 2 BCL
ตอนนี้เมื่อคุณบอก Visual Studio 2010 ให้กำหนดเป้าหมาย. NET Framework 3.5 จะทำให้แน่ใจว่าคุณจะไม่ใช้ประเภท BCL จาก Framework Framework รุ่นใด ๆ ในภายหลัง นอกจากนี้ยังจะตรวจสอบให้แน่ใจว่าโค้ดเอาต์พุตโดยคอมไพเลอร์ C # จะไม่ต้องการคุณสมบัติเฉพาะใน CLR เวอร์ชัน 4 เท่านั้น
เวอร์ชันภาษา C # มีส่วนเกี่ยวข้องกับสิ่งนี้น้อยมาก สิ่งที่คอมไพเลอร์ C # ทำเพื่อนำซอร์สโค้ดของคุณและแปลเป็นภาษาการเขียนโปรแกรมระดับต่ำกว่ามากที่เรียกว่า CIL (Common Intermediate Language) การสร้างภาษา C # บางอย่างจะไม่สามารถจดจำได้ใน CIL อีกต่อไปตัวอย่างเช่นyield return
และyield break
ไม่มีอยู่ใน CIL พวกมันถูกแปลเป็นเพียงการนำไปใช้งานIEnumerator<T>
อินเตอร์เฟส
ในการสรุปนี้: เวอร์ชันภาษา C # จะไม่เกี่ยวข้องทันทีที่มีการรวบรวมรหัสของคุณ อะไรคือสิ่งที่สำคัญคือ ...
ไม่ว่าเอาต์พุต CIL / "bytecode" จะเข้ากันได้กับ. NET Framework เป้าหมาย (ถ้าคุณกำหนดเป้าหมาย. NET 3.5 มันจะเข้ากันได้กับ. NET 2 ด้วยเหตุผลที่กล่าวถึงข้างต้น); และ
ไม่ว่ารหัสของคุณอ้างถึง / ทำให้การใช้งานประเภทที่มีอยู่ในกรอบเป้าหมาย
ข้อยกเว้นที่น่าสังเกตหนึ่งอย่าง (ในแง่ที่ว่าภาษา C # ต้องใช้เฟรมเวิร์กเฉพาะรุ่นนี่เป็นกรณีสุดท้ายที่ generics ที่แนะนำให้ใช้ IIRC) ซึ่งอาจเป็นคำdynamic
สำคัญC # มันอาจจะถูกคอมไพล์ไปยังโค้ดที่ต้องการประเภทจากSystem.Dynamic
เนมสเปซซึ่งมีให้บริการตั้งแต่ NET 4 เท่านั้น แต่ไม่ต้องกังวล: ถ้าคุณตั้งค่าโครงการ Visual Studio 2010 ของคุณเพื่อกำหนดเป้าหมายเป็น. NET 3.5 คุณควร ข้อผิดพลาดของคอมไพเลอร์ถ้าคุณกำลังพยายามใช้สิ่งที่ไม่พร้อมใช้งานหรือเข้ากันได้กับ. NET Framework รุ่นนั้นโดยเฉพาะ
โปรดทราบว่า VS2010 ไม่ใช่ IDE ที่รองรับสำหรับการพัฒนา 9.3 คุณจะไม่ได้รับการอ้างอิงประกอบความช่วยเหลือหรือการรวมแม่แบบ
คุณสามารถทำให้มันทำงาน: http://forums.arcgis.com/threads/29935-VS2010-with-version-9.3.1