【问题标题】:Problems executing compiled 3.5 code on a server which only has the 2.0 framework在只有 2.0 框架的服务器上执行编译的 3.5 代码时出现问题
【发布时间】:2010-09-15 02:50:10
【问题描述】:

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

我在 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 然后安装它。它不会在 2000 年安装,因为那里不支持它。也不支持使用复制的 dll 版本。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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 上运行,但是您需要注意一些问题。如果 anything 访问了 .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】:

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

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


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

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

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

      【讨论】:

      • 感谢您指出“.NET 许可证明确禁止将库与您的应用一起分发”。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 正如 lassevk 提到的,.NET 许可证明确禁止这样做。此外,您可能至少需要 2.0 SP1。
        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

          我很确定 LINQ 是要求 3.5 的原因之一。很多其他的东西,比如 lambda 表达式等,只是编译器的诡计。

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

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

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

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

              【讨论】:

                猜你喜欢
                • 2013-09-22
                • 1970-01-01
                • 2012-04-28
                • 1970-01-01
                • 2021-07-09
                • 1970-01-01
                • 1970-01-01
                • 2019-09-15
                • 1970-01-01
                相关资源
                最近更新 更多