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

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

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

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

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

今天我试图发布到服务器,我无法在WEB.CONFIG中通过此错误

配置错误

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

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

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

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

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

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


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

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

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

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

因为System.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之外的机器上显示窗口时,应用程序会抛出exception。

另一个问题是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 +特定语言的function或类型,您的代码仍然会失败,但这应该让您通过web.config。

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

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

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

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

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

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

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

因此,您可以使用匿名类型,扩展方法和Lambda表达式,但只要您执行LINQ之类的操作,就需要外部库作为3.5的一部分。

如果您只是在执行LINQ to Object,则可以将LINQBridge添加到您的发行版中。

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

您最终可以发送C#源代码,该代码在开发机器上编译,但是C#3编译器存在,但无法在仅配备C#2的服务器上编译。在这种情况下,您也无法使用任何新的语言function。

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

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