【问题标题】:LINQ-related error when using simple CSharpCodeProvider in ASP.NET在 ASP.NET 中使用简单的 CSharpCodeProvider 时出现与 LINQ 相关的错误
【发布时间】:2012-11-19 17:01:06
【问题描述】:

我创建了一个非常简单的自定义编译器:

public class SimpleCompiler : CSharpCodeProvider
{
    public SimpleCompiler() : base()
    {
        File.AppendText("d:\foo.txt","bar");
    }
}

在我的 web.config 文件中,我复制/粘贴了现有配置来声明这个新的编译器。

<compiler language="c#;cs;csharp" extension=".cs" type="XXX.SimpleCompiler, XXX" warningLevel="4">
    <providerOption name="CompilerVersion" value="v3.5"/>
    <providerOption name="WarnAsError" value="false"/>
</compiler>

但在使用以下代码访问用户控件时出现错误:

<asp:Label runat="server" ID="Label3">
    <%# 
         string.Join("<br/>",((ReadOnlyCollection<AAA>)Eval("ListOfAs")).Select(x => x.Name).ToArray())                                 
    %>
 </asp:Label>

&gt;&lt;AAA&gt; 上失败。某处应该缺少某些东西(使用?),但是使用标准编译器 Microsoft.CSharp.CSharpCodeProvider 可以很好地构建。

错误信息是:

编译器错误消息:CS1525:无效的表达式术语'>'

更新: 好像和LINQ有关。它在控制代码中使用 LINQ 的所有页面上都失败。但是 System.Core.dll 包含在 Web.config 中。

Update2:我能够在一个新的 Web 应用程序项目中重现它。

  1. 添加一个新类:

    namespace WebApplication1
    {
        public class SimpleCompiler : CSharpCodeProvider
        {
            private void Log(string message)
            {
                File.AppendAllText("d:\\foo.txt", DateTime.Now.Ticks+Environment.NewLine);
            } 
       }
    

    }

  2. 更新web.config

    <system.codedom>
        <compilers>
          <compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="WebApplication1.SimpleCompiler, WebApplication1">
              <providerOption name="CompilerVersion" value="v3.5"/>
              <providerOption name="WarnAsError" value="false"/>
            </compiler>
        </compilers>
    </system.codedom>
    
  3. Default.aspx 更改为:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>
    <%@ Import Namespace="System.Linq" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head runat="server"></head>
        <body>
            <form id="form1" runat="server">
            <div>
                <%
                    int x = (new int[] { 1, 2, 3, 4, 5 }).Where(z => z > 2).Count();
                    this.Response.Write(x);
                %>
            </div>
            </form>
        </body>
    </html>
    

如果我将项目更新为4.0,它可以工作。但我不能在其他人中这样做。

【问题讨论】:

  • 你确定它没有在x =&gt; x ...附近失败吗?
  • 您是从 .NET 2 引用 CSharpCodeProvider 吗?
  • 你能否在不使用的情况下使用 ASP.NET,例如从一个简单的控制台应用程序?
  • 如果我使用“默认”编译器,代码工作正常,因此我很确定x =&gt; x 没问题。我正在使用.NET 3.5。但我不知道如何在 Asp.NET 之外对其进行测试:大多数页面构建良好,只有这样的代码被破坏。
  • @SimonMourier,DLL 信息:Assembly System.dll, v2.0.50727

标签: c# asp.net linq web-config csharpcodeprovider


【解决方案1】:

尝试添加到 Web.config:

<pages>
   <namespaces>
      <add namespace="System.Linq" />
   </namespaces>
</pages>

<compilation>
    <assemblies>
        <add assembly="System.Core" />
    </assemblies>
</compilation>

【讨论】:

  • @FrancoisB:同样的代码使用默认的 C# 编译器编译得很好,对吗?
  • 对。只有 Linq 表达式无法构建。
猜你喜欢
  • 2019-03-08
  • 2011-10-25
  • 2015-06-02
  • 2018-08-11
  • 2019-11-24
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 2014-10-09
相关资源
最近更新 更多