Versi C # untuk ArcObjects 9.3

10

Bisakah saya menggunakan C # 4.0 dengan kerangka kerja target diatur ke .NET 3.5 untuk mengembangkan ekstensi untuk ArcMap 9.3? Atau harus C # 3.0 atau lebih awal?

Mike Rogers
sumber
Jika kerangka kerja target 3,5 maka Anda menggunakan C # 2.0 dengan ekstensi. ArcEngine 10 perlu menargetkan .NET 3.5 sehingga Anda kehilangan beberapa barang 4.0. Saya ingin menggunakan kontrol kalender WPF di aplikasi saya, tetapi saya tidak bisa karena itu 4.0. Jadi saya harus menggunakan winforms.
patrick
Saya menggunakan C # 4.0 untuk mengembangkan ekstensi untuk ArcMap 10 dengan kerangka kerja target ditetapkan ke 3,5 jadi saya bertanya-tanya apakah itu akan kompatibel mundur selama kerangka kerja tetap 3,5. Haruskah saya mengubah ekstensi ArcMap 10 saya menjadi C # 2.0 sehingga dapat dikompilasi ulang dengan ArcMap 9 tanpa harus melakukan banyak pengeditan kode? Akankah C # 3.0 bekerja dengan ArcMap 9?
Mike Rogers

Jawaban:

13

Jawaban singkat: Dalam pengalaman saya, seharusnya sama sekali tidak ada masalah mengembangkan kode .NET 3.5 berbasis untuk ArcGIS 9.3 di Visual Studio 2010 (dengan C # bahasa versi 4), selama Anda secara eksplisit menargetkan .NET Framework 3.5. Versi bahasa C # sebagian besar tidak relevan di sini.

PS: Jawaban ini tidak masuk ke perbedaan yang ada antara mengembangkan ekstensi ArcGIS untuk versi 9.3 dan 10. (ESRI telah membuat beberapa perubahan besar pada model add-in, tapi saya berasumsi Anda sadar akan hal itu. .)

Jawaban yang lebih panjang: Anda perlu membedakan antara versi bahasa C #, dan versi Kerangka yang ditargetkan.

Anda dapat menganggap .NET Framework terdiri dari dua bagian utama: CLR (Common Language Runtime), dan BCL (Base Class Library). Yang pertama adalah "mesin virtual", sedangkan yang terakhir adalah perpustakaan kelas (berisi semua jenis yang dapat Anda lihat di MSDN).

.NET Frameworks 2 hingga 3.5 semuanya menggunakan CLR yang sama (versi 2), yaitu lingkungan eksekusi belum benar-benar berkembang. Namun, yang berkembang adalah BCL. Jika Anda menjalankan aplikasi .NET 3.5 pada mesin .NET 2, masalah utama bukanlah "bytecode" (CIL) yang tidak kompatibel (tidak akan), tetapi aplikasi mungkin merujuk dan menggunakan tipe yang belum tersedia di .NET 2 BCL.

Sekarang, ketika Anda memberi tahu Visual Studio 2010 untuk menargetkan .NET Framework 3.5, itu akan memastikan bahwa Anda tidak akan menggunakan tipe BCL dari versi Framework yang lebih baru. Ini juga akan memastikan bahwa output kode oleh kompiler C # tidak akan memerlukan fitur yang hanya tersedia di versi CLR 4.

Versi bahasa C # sangat sedikit hubungannya dengan semua ini. Apa yang sebenarnya dilakukan oleh kompiler C # untuk mengambil kode sumber Anda dan menerjemahkannya ke bahasa pemrograman level jauh lebih rendah yang disebut CIL (Common Intermediate Language). Konstruk bahasa C # tertentu tidak lagi dapat dikenali di CIL: Misalnya, yield returndan yield breaktidak ada di CIL. Mereka hanya diterjemahkan ke implementasi IEnumerator<T>antarmuka.

Untuk meringkas ini: Versi bahasa C # menjadi tidak relevan segera setelah kode Anda dikompilasi. Apa yang penting adalah ...

  • apakah output CIL / "bytecode" kompatibel dengan .NET Framework yang ditargetkan (jika Anda menargetkan .NET 3.5, itu akan kompatibel bahkan dengan .NET 2 untuk alasan yang disebutkan di atas); dan

  • apakah kode Anda merujuk / menggunakan tipe yang tersedia dalam kerangka kerja target.

Satu pengecualian penting (dalam arti bahwa bahasa C # membangun memerlukan versi tertentu dari kerangka kerja; ini adalah yang terakhir kasus whwn generics diperkenalkan IIRC) mungkin kata kunci C # dynamic. Mungkin dikompilasi ke kode yang memerlukan jenis dari System.Dynamicnamespace, yang hanya tersedia sejak. NET 4. Tapi jangan khawatir: Jika Anda telah mengatur proyek Visual Studio 2010 Anda untuk menargetkan. NET 3.5, Anda harus mendapatkan kesalahan kompiler jika Anda mencoba menggunakan hal-hal yang tidak tersedia, atau kompatibel dengan, versi .NET Framework tertentu.

stakx
sumber
1
@ Seebunk, ini tidak sepenuhnya benar. Bahkan jika mungkin tidak ada ekstensi ESRI SDK untuk ArcGIS 9.3 / VS2010, ini tidak akan menghentikan Anda dari referensi rakitan ArcGIS dan mulai menulis kode. Artinya, masih mungkin menggunakan IDE itu, hanya saja lebih tidak nyaman. Mungkin juga ada beberapa pekerjaan manual yang terlibat (mendaftar komponen dll) tetapi sekali lagi, ini layak AFAIK.
stakx
Yap maaf, lihat saja itu :)
SeaJunk
Anda memberikan penjelasan yang baik, tetapi hubungannya sedikit lebih rumit, karena fitur ketiganya (CLR, BCL dan C #) sangat dipengaruhi oleh satu sama lain.
Petr Krebs
Sebagai catatan, ada juga beberapa fakta menarik yang sangat menarik tentang evolusi CLR dan C #. Sebagai contoh, kovarians dan contravariance pada parameter tipe generik diperkenalkan di CLR 2.0, tetapi tidak sampai C # 4 ketika mulai didukung oleh bahasa. Yang lain, kebetulan contoh yang bagus dari poin Anda: LINQ, diperkenalkan di C # 3, bergantung pada metode ekstensi, yang dapat disimulasikan dalam C # 2 dengan menggunakan System.Runtime.CompilerServices.ExtensionAttribute.
Petr Krebs
1
Blog Eric Lippert ( blogs.msdn.com/b/ericlippert ) adalah sumber yang bagus di berbagai sudut gelap .NET / C # dan keputusan di balik desain mereka.
Petr Krebs