关于 c#:在只有 2.0 框架的服务器上执行编译的 3.5 代码的问题

Problems executing compiled 3.5 code on a server which only has the 2.0 framework

我似乎无法在我的开发服务器上启动并运行我的应用程序,我不确定为什么。

我在 VS 2008 中编译了我的代码,目标框架为 3.5。我使用 3.5 主要是因为我已经相当广泛地实现了 LINQ。在本地编译和运行没有任何问题。

问题是我的服务器只有 2.0 .Net 框架,升级到 3.5 显然不会发生。

在做了一些研究之后,我的印象是,只要我尝试执行已编译的代码,服务器就不需要安装 3.5。

今天我正在尝试发布到服务器,但在我的 WEB.CONFIG

中无法解决此错误

配置错误

解析器错误消息:不允许子节点。

providerOption name="CompilerVersion" value="v3.5"/

编辑添加问题:
我看过一些关于可能将我的引用设置为"复制本地"的帖子,这可能允许我在 2.0 服务器上运行。想法?


您是对的,3.5 在 2.0 CLR 上运行,但 3.5 包含库,如果您使用过其中的任何一个,除非您在该服务器上安装 3.5,否则您很不走运。

3.5 程序有很多选择不能在 2.0 上正确运行,所以我会考虑降级程序,或升级服务器。

关于复制本地的注意事项。即使您复制了应用程序使用的所有 3.5 库,也不能保证它会起作用,而且很可能不会。即便如此,.NET 许可证明确禁止将库与您的应用程序一起分发。

既然您已经声明您使用 LINQ,那么让您的应用程序运行的唯一合法方法就是安装 3.5 许可证。

或者,您可以仅使用 2.0 重写您的应用。


针对 3.0 或 3.5 编译的代码可以在 2.0 框架上运行,但前提是您不使用任何特定于 3.0 框架的库。找出导致代码失败的原因的一种好方法是将目标切换到 2.0 并更改内容以便编译。由于您的目标安装之一是 .NET 2.0,您将不得不编写 .NET 2.0 代码;这不是 .NET 独有的。过去,编写同时在 Win95 和 WinNT 中执行的应用程序需要开发人员进行额外的工作,以仔细确保使用适当的 API。

从技术上讲,以 3.5 为目标的代码可以在 2.0 上毫无问题地运行,但是您必须注意一些问题。如果任何东西访问了 .NET 2.0 中不可用的东西,那将会失败。这不会在应用程序启动时发生,而是在应用程序尝试拨打电话时发生。我通过制作一个执行少量输出的控制台应用程序对此进行了测试,然后尝试显示一个 WPF 窗口。进行了输出,但是当应用程序尝试在只有 .NET 2.0.

的机器上显示窗口时,它会抛出异常

另一个问题是 VS 2008 实际上是随 .NET Framework 2.0 SP1 一起提供的,SP1 中有一些类型和方法不在普通 2.0 Framework 中。 Visual Studio 不会将这些方法标记为不安全。

最后,如果这是一个 Web 应用程序,3.5 目标项目的默认 web.config 文件与 2.0 目标项目的 web.config 文件非常不同。确保您分发的是兼容的 web.config。这很可能就是您遇到的问题。一种廉价的解决方法可能是将目标更改为 .NET 2.0,复制该 web.config,然后在这种情况下使用它。请记住,如果您使用任何 3.0 特定的语言功能或类型,您的代码仍然会失败,但这应该会让您通过 web.config.


我很确定 LINQ 是使 3.5 成为必需的东西之一。很多其他的东西,比如 lambda 表达式等等,都只是编译器的把戏。

因为 System.Linq 是 3.5 的特性,所以框架必须是那个版本。

确定的一个好方法是将目标框架更改为 2.0 并查看它是否可以构建。


除非在服务器上安装 3.5,否则您将无法在服务器上运行针对 3.5 的代码。

问题不在于您的代码,而在于缺少所需的库。


我正要发表评论,但我的代表不在那里。到目前为止,我同意人群的观点,并相信 lassevk 的答案是最好的,因此请为此给他代表。我想让您知道的一个问题是,一旦您在 IIS 服务器(6 或更高版本)上安装了 3.5。当您转到 IIS 管理器并右键单击您的网站以访问 ASP.Net 选项卡时。安装 3.5 框架后,您将看到没有 3.5 选项可用。它仍将显示为 2.0.50727。别担心,它仍然可以正常工作。由于这种不一致(感谢微软),造成了一些混乱。实际上,我认为这就是为什么您可能认为 2.0 可以很好地运行 3.5 代码的原因。希望这会有所帮助,请任何人对其进行编辑,使其更有意义。


您可以在面向 .NET 2.0 的同时使用某些 C# 3 功能。它的语言功能在编译为 IL 时将在 2.0 CLR 上运行,无论该 CLR 是否是 2.0 或更高版本框架安装的一部分。

因此您可以使用匿名类型、扩展方法和 Lambda 表达式,但是一旦您执行诸如 LINQ 之类的操作,您就需要属于 3.5 的外部库

如果您只使用 LINQ to Object,您可以将 LINQBridge 添加到您的发行版中。

您可能遇到的另一个问题是,如果您要发布包含源代码的 Web 应用程序,例如代码隐藏文件、行内代码和 App_Code 文件夹中的 .cs。

您最终可能会发布 C# 源代码,这些代码在带有 C# 3 编译器的开发机器上编译,但无法在仅配备 C# 2 的服务器上编译。在这种情况下,您也无法使用任何新的语言功能。

更糟糕的是,在 Visual Studio 中将 .NET 2.0 框架指定为目标并不会阻止您使用 C# 3 语言功能。您不会收到此类语法无法在 2.0 机器上编译的警告。

因此,如果您要发布这样的 Web 应用程序,则需要先编译几乎所有内容。


Web.Config 中有一个错误。已发布的 Web.Config 设置为允许从 .NET 3.5 编译,这就是它包含构建提供程序信息的原因。

除此之外,您的代码将无法运行。通过使用 LINQ,您将引用 .NET 2.0 中不存在的程序集。


这是不可能的。尽管 CLR 没有改变(就像它在 v1.1 和 v2.0 之间所做的那样),但库已经改变了。您无法运行未安装 3.5 框架的 3.5 应用程序。 3.5 框架使所有 Linq 功能成为可能。


您可以将 3.5 dll 复制到服务器上。您绝对可以在 2.0 服务器上运行 3.5 代码。