ArcObjects 9.3的C#版本


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之一。
帕特里克

我使用C#4.0开发了针对ArcMap 10的扩展,并将目标框架设置为3.5,因此我想知道只要框架保持3.5,它是否会向后兼容。我是否应该将ArcMap 10扩展名更改为C#2.0,以便可以在无需进行大量代码编辑的情况下将其与ArcMap 9重新编译?C#3.0是否可以与ArcMap 9配合使用?
Mike Rogers'2

Answers:


13

简短的答案:根据我的经验,只要您明确地将.NET Framework 3.5作为目标,那么在Visual Studio 2010(使用C#语言版本4)中为ArcGIS 9.3开发基于.NET 3.5的代码就绝对没有问题。C#语言版本在这里几乎无关紧要。

PS:这个答案并没有解决为版本9.3和10开发ArcGIS扩展之间存在的差异。(ESRI对加载项模型进行了许多重大更改,但是我假设您已经意识到了这一点。 )

更长的答案:您需要区分C#语言版本和目标Framework版本。

您可以认为.NET Framework由两个主要部分组成:CLR(公共语言运行时)和BCL(基类库)。前者是“虚拟机”,而后者是类库(包含您可以在MSDN上查找的所有类型)。

直到3.5的.NET Framework 2都使用相同的CLR(版本2),也就是说,执行环境尚未真正演变。但是,已经发展了BCL。如果您在.NET 2机器上运行.NET 3.5应用程序,则主要问题不是“字节码”(CIL)不兼容(不会),而是该应用程序可能引用并使用.NET 2 BCL中尚不可用的类型。

现在,当您告诉Visual Studio 2010以.NET Framework 3.5为目标时,它将确保您不会使用任何更高版本的Framework中的BCL类型。它还将确保C#编译器输出的代码将不需要仅在CLR版本4中可用的功能。

C#语言版本与此无关。C#编译器实际上所做的是获取源代码并将其转换为称为CIL(通用中间语言)的底层编程语言。某些C#语言结构将不再是识别在CIL:例如,yield return并且yield break不要在CIL不存在。它们可以简单地转换为实现IEnumerator<T>接口。

总结一下:编译代码后,C#语言版本就变得无关紧要。什么重要的是...

  • 输出的CIL /“字节码”是否与目标.NET Framework兼容(如果目标为.NET 3.5,则由于上述原因,它甚至与.NET 2也兼容);和

  • 您的代码是否引用/利用了目标框架中可用的类型。

一个显着的例外(就某种意义上来说,C#语言构造需要特定版本的框架;这是IIRC引入泛型的最后一种情况)可能是C#关键字dynamic。它可能会被编译为需要System.Dynamic名称空间中的类型的代码,该名称空间仅从.NET 4开始可用。但是不用担心:如果您已将Visual Studio 2010项目设置为以.NET 3.5为目标,则应该获得一个。如果您尝试使用特定的.NET Framework版本不可用或不兼容的东西,则会发生编译器错误。


1
@SeaJunk,这不是完全正确的。即使可能没有针对ArcGIS 9.3 / VS2010的ESRI SDK扩展,也不会阻止您引用ArcGIS程序集并开始编写代码。也就是说,仍然可以使用该IDE,只是更加不舒服。可能还会涉及更多的手动工作(注册组件等),但同样,这是可行的AFAIK。
stakx 2012年

是的,很抱歉,只是看了一下:)
SeaJunk

您提供了一个很好的解释,但是它们之间的关系要复杂一些,因为这三个功能(CLR,BCL和C#)彼此之间都受到很大的影响。
Petr Krebs 2012年

附带说明一下,关于CLR和C#的演变,也很少有有趣的事实。例如,在CLR 2.0中引入了泛型类型参数的协变和矛盾,但是直到C#4才开始支持该语言。另一个,可能是您的观点的一个很好的例子:C#3中引入的LINQ依赖于扩展方法,可以在C#2中使用System.Runtime.CompilerServices.ExtensionAttribute对其进行仿真。
彼得·克雷布斯

1
埃里克·利珀特(Eric Lippert)的博客(blogs.msdn.com/b/ericlippert)是有关.NET / C#各个黑暗角落以及其设计背后决策的绝佳资源。
彼得·克雷布斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.