เวอร์ชั่น C # สำหรับ ArcObjects 9.3


10

ฉันสามารถใช้ C # 4.0 กับกรอบงานเป้าหมายที่กำหนดเป็น. NET 3.5 เพื่อพัฒนาส่วนขยายสำหรับ ArcMap 9.3 ได้หรือไม่? หรือต้องเป็น C # 3.0 หรือเก่ากว่า


หากกรอบเป้าหมาย 3.5 คุณใช้ C # 2.0 กับส่วนขยาย ArcEngine 10 ต้องการกำหนดเป้าหมาย. NET 3.5 เพื่อให้คุณพลาดสารพัด 4.0 ฉันต้องการใช้การควบคุมปฏิทิน wpf ในแอพของฉัน แต่ฉันทำไม่ได้เพราะนั่นคือ 4.0 ดังนั้นฉันต้องใช้ winforms อันหนึ่ง
patrick

ฉันใช้ C # 4.0 เพื่อพัฒนาส่วนขยายสำหรับ ArcMap 10 โดยมีเฟรมเวิร์กเป้าหมายตั้งไว้ที่ 3.5 ดังนั้นฉันสงสัยว่ามันจะเข้ากันได้ย้อนหลังหรือไม่ตราบใดที่เฟรมยังคงอยู่ 3.5 ฉันควรเปลี่ยนส่วนขยาย ArcMap 10 เป็น C # 2.0 เพื่อให้สามารถคอมไพล์ใหม่ด้วย ArcMap 9 ได้โดยไม่ต้องทำการแก้ไขโค้ดอีกมากมาย C # 3.0 จะทำงานกับ ArcMap 9 ได้หรือไม่
Mike Rogers

คำตอบ:


13

คำตอบสั้น ๆ จากประสบการณ์ของฉันไม่ควรมีปัญหาในการพัฒนารหัสที่ใช้. 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 รุ่นนั้นโดยเฉพาะ


1
@ SeaJunk นี้ไม่ถูกต้องอย่างสมบูรณ์ แม้ว่าอาจไม่มี ESRI SDK ส่วนขยายสำหรับ ArcGIS 9.3 / VS2010 สิ่งนี้จะไม่หยุดคุณจากการอ้างอิงชุดประกอบ ArcGIS และเริ่มเขียนโค้ด นั่นคือยังคงเป็นไปได้ที่จะใช้ IDE นั้นอึดอัดกว่าเท่านั้น อาจมีการทำงานด้วยตนเองเพิ่มเติมที่เกี่ยวข้อง (การลงทะเบียนส่วนประกอบ ฯลฯ ) แต่อีกครั้ง AFAIK เป็นไปได้
stakx

อ๋อขอโทษเพิ่งเงยหน้าขึ้นดู :)
SeaJunk

คุณให้คำอธิบายที่ดี แต่ความสัมพันธ์นั้นซับซ้อนกว่านี้เล็กน้อยเนื่องจากคุณสมบัติของทั้งสาม (CLR, BCL และ C #) นั้นได้รับอิทธิพลอย่างมากจากกันและกัน
Petr Krebs

ในฐานะที่เป็นบันทึกด้านข้างมีข้อเท็จจริงสนุก ๆ ที่น่าสนใจเกี่ยวกับวิวัฒนาการของ CLR และ C # ตัวอย่างเช่นความแปรปรวนร่วมและความแปรปรวนของพารามิเตอร์ประเภททั่วไปได้รับการแนะนำใน CLR 2.0 แต่มันไม่ได้จนกว่า C # 4 เมื่อมันเริ่มได้รับการสนับสนุนโดยภาษา อีกตัวอย่างหนึ่งที่เป็นตัวอย่างที่ดีของประเด็นของคุณ: LINQ ซึ่งถูกนำมาใช้ใน C # 3 อาศัยวิธีการขยายซึ่งสามารถจำลองใน C # 2 ด้วยการใช้ System.Runtime.CompilerServices.ExtensionAttribute
Petr Krebs

1
บล็อกของ Eric Lippert ( blogs.msdn.com/b/ericlippert ) เป็นแหล่งข้อมูลที่ยอดเยี่ยมในมุมมืดของ NET / C # และการตัดสินใจที่อยู่เบื้องหลังการออกแบบของพวกเขา
Petr Krebs

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