在仅具有2.0框架的服务器上执行编译3.5代码的问题

时间:2008-10-03 15:58:20

标签: c# asp.net .net-3.5

我似乎无法在我的开发服务器上启动并运行我的应用程序而且我不确定原因。

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

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

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

今天我正在尝试发布到服务器,我无法在WEB.CONFIG中解决此错误

配置错误

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

providerOption name =“CompilerVersion”value =“v3.5”/

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

9 个答案:

答案 0 :(得分:7)

你在2.0 CLR上运行3.5是正确的,但3.5包含库,如果你使用了其中任何一个,除非你在该服务器上安装3.5,否则你运气不好。

3.5程序有很多选项无法仅在2.0上正常运行,因此我会考虑降级程序或升级服务器。


关于复制本地的注意事项。即使您复制了应用程序使用的所有3.5个库,也无法保证它能够正常工作,而且很可能不会。即便如此,.NET许可证明确禁止在您的应用程序中分发库。

由于您已声明使用LINQ,因此运行应用程序的唯一合法方法是安装3.5许可证。

或者,您只能使用2.0重写您的应用。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

针对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。

答案 3 :(得分:1)

除非你在服务器上安装了3.5,否则你无法在服务器上运行目标为3.5的代码。

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

答案 4 :(得分:0)

这是不可能的。虽然CLR没有改变(就像在v1.1和v2.0之间那样),但是库有。您无法运行未安装3.5 fraework的3.5应用程序。所有Linq功能都可以通过3.5框架实现。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

您可以在针对.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的服务器上编译。在这种情况下,您也无法使用任何新的语言功能。< / p>

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

因此,如果您要发布这样的网络应用程序,您首先需要编译所有内容。

答案 7 :(得分:0)

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

答案 8 :(得分:-2)

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